
首先明确题意:只要经过的每条边权值不超过
这题不需在线,可以离线解决。把边和询问的信息都保存下来,按照边权
建立并查集。对于每个询问
对于每个排序过后的询问都应当保存原始下标。找回原始询问编号保存答案即可。
也有大神说:“是否强制在线对这种做法其实没有影响吧,边权离散化之后可以直接预处理出所有答案。”
x// 1443Dusing namespace std;
struct edge{ int u, v, w;} a[SIZE];
struct query{ int l, pos;} q[SIZE];
int f[SIZE];int s[SIZE];int res[SIZE];int siz[SIZE];bool operator <(edge a, edge b){ return a.w<b.w;}bool operator <(query a, query b){ return a.l<b.l;}int n, m, T;
int getRoot(int x){ if(x==f[x]) return x; return f[x]=getRoot(f[x]);}
int ans=0;void mg(int x, int y){ int fx=getRoot(x); int fy=getRoot(y); if(fx==fy) return; f[fx]=fy; ans-=siz[fx]*(siz[fx]-1)/2; ans-=siz[fy]*(siz[fy]-1)/2; siz[fy]+=siz[fx]; ans+=siz[fy]*(siz[fy]-1)/2;}
void init(){ for(int i=0; i<=n; i++) f[i]=i, siz[i]=1;}
signed main(){ while(cin>>n>>m>>T) { ans=0; for(int i=1; i<=m; i++) cin>>a[i].u>>a[i].v>>a[i].w; sort(a+1, a+m+1); for(int i=1; i<=T; i++) cin>>q[i].l, q[i].pos=i; sort(q+1, q+T+1); init(); int j=1; for(int i=1; i<=T; i++) { while(j<=m && a[j].w<=q[i].l) { mg(a[j].u, a[j].v); j++; } //debug(ans) res[q[i].pos]=ans; } for(int i=1; i<=T; i++) cout<<res[i]<<endl; }
return 0;}All Rights Reserved 2022 Wang Zhanrui