zoukankan      html  css  js  c++  java
  • 【五校联考3day1】旅游

    这题我们可以将询问排序,将边按照比边权从小到大排序。
    在处理询问时,依次添加边,用并查集维护即可。
    上标:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct node{int u,v,d;}a[200010];
    struct edge{int x,y;}b[500010];
    int T,n,m,q,as[500010],x,y;
    int siz[200010],fa[200010],ans=0,first;
    
    inline int read()
    {
    	int x=0; char c=getchar();
    	while (c<'0' || c>'9') c=getchar();
    	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	return x;
    }
    
    int cmp(node x,node y) {return x.d<y.d;}
    
    int cmp1(edge x,edge y) {return x.x<y.x;}
    
    int gf(int x) {return fa[x]==x ? x:fa[x]=gf(fa[x]);}
    
    int main()
    {
    //	freopen("travel.in","r",stdin);
    //	freopen("travel.out","w",stdout);
    	T=read();
    	while (T--)
    	{
    		n=read(),m=read(),q=read();
    		for (int i=1;i<=n;i++) siz[i]=1,fa[i]=i;
    		for (int i=1;i<=m;i++)
    			a[i].u=read(),a[i].v=read(),a[i].d=read();
    		sort(a+1,a+m+1,cmp);
    		for (int i=1;i<=q;i++) b[i].x=read(),b[i].y=i;
    		sort(b+1,b+q+1,cmp1);
    		first=1;ans=0;
    		for (int i=1;i<=q;i++)
    		{
    			while (first<=m && a[first].d<=b[i].x)
    			{
    				x=gf(a[first].u),y=gf(a[first].v);
    				if (x!=y)
    				{
    					ans-=siz[x]*(siz[x]-1)+siz[y]*(siz[y]-1);
    					fa[x]=y,siz[y]+=siz[x];
    					ans+=siz[y]*(siz[y]-1);
    				}
    				first++;
    			}
    			as[b[i].y]=ans;
    		}
    		for (int i=1;i<=q;i++) printf("%d
    ",as[i]);
    	}
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    求某个数的位数公式
    ArrayList和lInkedList比较
    队列
    抽象数据结构-栈
    LinkedList的实现
    ArrayList的实现
    Iterator和List的一些问题
    SCHEMA约束
    DTD约束
    XML解析
  • 原文地址:https://www.cnblogs.com/jz929/p/11817634.html
Copyright © 2011-2022 走看看