QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#403866 | #7415. Fast Spanning Tree | Call_me_Eric | WA | 0ms | 20704kb | C++14 | 3.0kb | 2024-05-02 19:42:08 | 2024-05-02 19:42:14 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
bool stmemory;
namespace Call_me_Eric{
inline int read(){
int x = 0, f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
return x * f;
}
const int maxn = 3e5 + 10;
int n, m;
struct edge{
int u, v, s, id;
edge(int u = 0,int v = 0,int s = 0,int id = 0)
:u(u),v(v),s(s),id(id){}
}e[maxn];
vector<int> ans;
int fa[maxn], siz[maxn];
bool del[maxn];
struct warn{
int lim, id;
warn(int lim = 0,int id = 0):lim(lim),id(id){}
friend bool operator < (warn a,warn b){return a.lim != b.lim ? a.lim < b.lim : a.id < b.id;}
friend bool operator > (warn a,warn b){return a.lim != b.lim ? a.lim > b.lim : a.id > b.id;}
};
int getf(int x){return fa[x] == x ? x : fa[x] = getf(fa[x]);}
priority_queue<int,vector<int>,greater<int> > que;
priority_queue<warn,vector<warn>,greater<warn> > q[maxn];
void main(){
n = read(), m = read();int u, v, s;
for(int i = 1;i <= n;i++)siz[i] = read(), fa[i] = i;
for(int i = 1;i <= m;i++){
u = read(), v = read(), s = read();
e[i] = edge(u,v,s,i);
if(siz[u] + siz[v] >= s)que.push(i);
else{
q[u].emplace((s + siz[u] - siz[v] + 1) / 2,i);
q[v].emplace((s + siz[v] - siz[u] + 1) / 2,i);
}
}
auto check = [](int id){
if(del[id])return;
int u = getf(e[id].u), v = getf(e[id].v);
if(u == v)return;
if(siz[u] + siz[v] >= e[id].s){ans.emplace_back(id);del[id] = 1;return;}
q[u].emplace((e[id].s + siz[u] - siz[v] + 1) / 2,id);
q[v].emplace((e[id].s + siz[v] - siz[u] + 1) / 2,id);
return;
};
while(!que.empty()){
int id = que.top();que.pop();if(del[id])continue;
u = e[id].u, v = e[id].v, s = e[id].s;
int fu = getf(u), fv = getf(v), sum = siz[fu] + siz[fv];
if(fu == fv)continue;
ans.emplace_back(id);del[id] = 1;
if(q[u].size() < q[v].size())swap(u, v);
fa[v] = u;siz[u] += siz[v];siz[u] = min((int)1e9,siz[u]);
while(!q[v].empty()){
warn tp = q[v].top();q[v].pop();
if(siz[u] >= tp.lim)check(tp.id);
else q[u].emplace(tp);
}
while(!q[u].empty()){
warn tp = q[u].top();
if(siz[u] >= tp.lim){check(tp.id);q[u].pop();}
else break;
}
}
printf("%d\n",ans.size());
for(int i : ans)printf("%d ",i);
puts("");
return;
}
};
bool edmemory;
signed main(){
auto stclock = clock();
Call_me_Eric::main();
auto edclock = clock();
cerr << (&stmemory - &edmemory) / 1024.0 / 1024.0 << " Mib cost.\n";
cerr << (edclock - stclock) * 1.0 / CLOCKS_PER_SEC << " Sec cost.\n";
return 0;
}
/*
5 5
1 4 3 4 0
4 5 5
3 1 1
2 5 2
4 3 1
4 1 4
3 5
3 2 2
1 2 6
1 2 6
1 2 3
1 2 6
2 3 6
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 20532kb
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: 20700kb
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: 0ms
memory: 20704kb
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:
12 1 13 2 3 4 5 6 7 8 12 16 20
result:
wrong answer 1st numbers differ - expected: '8', found: '12'