QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#882561 | #7415. Fast Spanning Tree | gsn531 | WA | 2ms | 36472kb | C++26 | 3.4kb | 2025-02-05 09:22:58 | 2025-02-05 09:23:00 |
Judging History
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'