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;
    }
    
    转载需注明出处。
  • 相关阅读:
    Java变量在内存中的存储
    Java成员变量和局部变量
    Java类的定义与类的实例化
    面向对象编程思想
    Java数组深入
    Java的Arrays类 基本用法
    Intellij IDEA如何设置快速调整字体大小的快捷键
    Win10如何快速截屏
    应用层协议原理(二)
    应用层协议原理(一)
  • 原文地址:https://www.cnblogs.com/jz929/p/11817634.html
Copyright © 2011-2022 走看看