今天考试简直吃屎,这个普及组好题考场上真的应该想出来,题解就不写了,但注意题目有坑,数据并不满足0≤c,Li≤10^9。所以inf要定义的大些。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<cmath>
using namespace std;
#define rep(i,j,k) for(i=j;i<=k;++i)
#define per(i,j,k) for(i=j;i>=k;--i)
#define ll long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define mkp make_pair
#define X first
#define Y second
const int N=10005,M=100005;
int n,m,Q,S,par[N],sz[N];
struct EDGE{int a,b,w;}e[M];
struct QUERY{int L,flg,ans;}qu[M];
bool cmp1(EDGE x,EDGE y){return x.w<y.w;}
bool cmp2(QUERY x,QUERY y){return x.L<y.L;}
bool cmp3(QUERY x,QUERY y){return x.flg<y.flg;}
int getpar(int x){
if(par[x]!=x)par[x]=getpar(par[x]);
return par[x];
}
int main(){
int i,j,x,y;
scanf("%d%d%d",&n,&m,&Q);
rep(i,1,m)scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
sort(e+1,e+m+1,cmp1);e[m+1].w=2147483647;
rep(i,1,Q)scanf("%d",&qu[i].L),qu[i].flg=i;
sort(qu+1,qu+Q+1,cmp2);
rep(i,1,n)sz[par[i]=i]=1;
for(j=1;j<=Q&&qu[j].L<e[1].w;++j)
qu[j].ans=0;
rep(i,1,m){
x=getpar(e[i].a),y=getpar(e[i].b);
if(x!=y){
S+=sz[x]*sz[y];
if(sz[x]>sz[y])sz[x]+=sz[y],par[y]=x;
else sz[y]+=sz[x],par[x]=y;
}
while(j<=Q&&e[i].w<=qu[j].L&&qu[j].L<e[i+1].w)
qu[j++].ans=S;
}
sort(qu+1,qu+Q+1,cmp3);
rep(i,1,Q)printf("%d ",qu[i].ans);
puts("");
return 0;
}