QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#882561#7415. Fast Spanning Treegsn531WA 2ms36472kbC++263.4kb2025-02-05 09:22:582025-02-05 09:23:00

Judging History

This is the latest submission verdict.

  • [2025-02-05 09:23:00]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 36472kb
  • [2025-02-05 09:22:58]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;

#define int long long

#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define per(i, a, b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define fi first 
#define se second 
#define mkp make_pair
#define val(i) ((*q[i].begin()).fi - w[i])
#define upMn(i) Mn.insert(mkp(val(i), i))

const int maxn = 3e5 + 5, inf = 1e15;

int n, m;
struct node{
    int a, b, s; pii v;
}b[maxn];
int w[maxn], fa[maxn], Sz[maxn];
set<pii> q[maxn], Mn;

inline int fnd(int x){
    return fa[x] == x ? x : fa[x] = fnd(fa[x]);
}

vector<int> Ans; set<int> Tmp;

inline void Update(){
    while((*Mn.begin()).fi <= 0){

        int x = (*Mn.begin()).se; 
        int id = (*q[x].begin()).se;
        int y = b[id].a == x ? b[id].b : b[id].a;
        if(x != b[id].a) swap(x, y);
        
//        printf("find(%d,%d) id=%d (%d,%d,%d)\n", x, y, id, b[id].a, b[id].b, b[id].s);

        Mn.erase(mkp(val(x), x));
        if(x != y) Mn.erase(mkp(val(y), y));
        q[x].erase(mkp(b[id].v.fi, id));
        if(x != y) q[y].erase(mkp(b[id].v.se, id));
        
        if(x == y){ upMn(y); continue; }
        if(w[x] + w[y] >= b[id].s){
            Tmp.insert(id);
            upMn(x), upMn(y);
        } else{
            int sum = b[id].s - w[x] - w[y];
            sum = (sum + 1) / 2;
            b[id].v = mkp(w[x] + sum, w[y] + sum);
            q[x].insert(mkp(w[x] + sum, id));
            q[y].insert(mkp(w[y] + sum, id));
            upMn(x), upMn(y);
        }
    }
}

signed main(){
//    ios_base::sync_with_stdio(0); cin.tie(NULL);

    cin >> n >> m;
    rep(i, 1, n) cin >> w[i], fa[i] = i, Sz[i] = 1;
    rep(i, 1, m){
        cin >> b[i].a >> b[i].b >> b[i].s;
        int x = b[i].a, y = b[i].b;
        int k = b[i].s - w[x] - w[y];
        k = max(0ll, k); 
        k = (k + 1) / 2;
        q[x].insert(mkp(w[x] + k, i));
        q[y].insert(mkp(w[y] + k, i));
        b[i].v = mkp(w[x] + k, w[y] + k);
    } 
    rep(i, 1, n){
        q[i].insert(mkp(inf, inf));
        upMn(i);
    }

    while((*Mn.begin()).fi <= 0){
        Update();
        while(Tmp.size()){
            int id = *Tmp.begin(); Tmp.erase(Tmp.begin());
            int x = b[id].a, y = b[id].b;
            if(fnd(x) == fnd(y)) continue;
//            printf("id=%d (w[%d]=%d,w[%d]=%d,%d)\n", id, x, w[x], y, w[y], b[id].s);
            Ans.push_back(id);
            if(Sz[x] > Sz[y]) swap(x, y);
            fa[x] = y; Sz[y] += Sz[x]; w[y] += w[x];
            for(pii que : q[x]){
                int Id = que.se; if(Id == inf) continue;
                if(b[Id].a == b[Id].b) continue;
                
                if(b[Id].a == x){
                	if(b[Id].b == y){
                		q[y].erase(mkp(b[Id].v.se, Id));
                		continue;
					}
					b[Id].a = y;
				} else{
					if(b[Id].a == y){
						q[y].erase(mkp(b[Id].v.fi, Id));
						continue;
					}
					b[Id].b = y;
				}
                q[y].insert(que);
            }
            q[x].clear(); q[x].insert(mkp(inf, inf)); upMn(y);
//            rep(i, 1, n){
//            	for(pii nw : q[i]) printf("(%lld,%lld) ", nw.fi, nw.se); printf("\n");
//			}
//			rep(i, 1, m) printf("b[%d]=[%d,%d,%d] ", i, b[i].a, b[i].b, b[i].s); printf("\n");
//			return 0;
            Update();
        }
    }

    cout << Ans.size() << '\n';
    for(int x : Ans) cout << x << " "; cout << '\n';
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 34424kb

input:

5 5
1 4 3 4 0
4 5 5
3 1 1
2 5 2
4 3 1
4 1 4

output:

4
2 3 1 4 

result:

ok 5 number(s): "4 2 3 1 4"

Test #2:

score: 0
Accepted
time: 0ms
memory: 36472kb

input:

3 5
3 2 2
1 2 6
1 2 6
1 2 3
1 2 6
2 3 6

output:

2
3 5 

result:

ok 3 number(s): "2 3 5"

Test #3:

score: -100
Wrong Answer
time: 2ms
memory: 36472kb

input:

10 20
4 6 6 1 7 9 1 8 7 9
5 3 2
1 10 10
5 6 7
9 6 9
3 1 1
6 8 1
5 7 0
9 5 4
10 3 4
8 6 8
3 10 6
5 3 8
3 7 9
1 9 10
10 1 0
5 7 6
6 10 1
6 5 9
5 8 2
9 2 4

output:

14
1 2 3 4 5 6 7 8 9 12 13 17 18 20 

result:

wrong answer 1st numbers differ - expected: '8', found: '14'