#192. 道路维护

今天考试简直吃屎,这个普及组好题考场上真的应该想出来,题解就不写了,但注意题目有坑,数据并不满足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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值