• [bzoj1015][JSOI2008]星球大战starwar


    [bzoj1015][JSOI2008]星球大战starwar

    标签: 并查集


    题目链接

    题外话

    真没想到虚爷爷竟然会做这种水题。

    题解

    一看就知道并查集维护,然而并查集不能减边,所以离线一下反着加。

    Code

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    using namespace std;
    #define ll long long
    #define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
    #define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
    #define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
    inline int read()
    {
    	int sum=0,p=1;char ch=getchar();
    	while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
    	if(ch=='-')p=-1,ch=getchar();
    	while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
    	return sum*p;
    }
    
    const int maxn=4e5+20;
    
    struct node {
    	int v,next;
    };
    node e[maxn];
    int cnt,start[maxn];
    
    void addedge(int u,int v)
    {
    	e[++cnt]=(node){v,start[u]};
    	start[u]=cnt;
    }
    
    int n,m;
    
    void init()
    {
    	n=read();m=read();
    	REP(i,1,m)
    	{
    		int u=read()+1,v=read()+1;
    		addedge(u,v);
    		addedge(v,u);
    	}
    }
    
    int qu[maxn],vis[maxn];
    int fa[maxn];
    int fin(int x)
    {
    	return x==fa[x]?x:fa[x]=fin(fa[x]);
    }
    
    int ans[maxn];
    
    void doing()
    {
    	int k=read();
    	REP(i,1,k)qu[i]=read()+1,vis[qu[i]]=1;
    	REP(i,1,n)fa[i]=i;
    	int sum=n;
    	REP(u,1,n)
    	{
    		if(vis[u])continue;
    		EREP(i,u)
    		{
    			int v=e[i].v;
    			if(vis[v])continue;
    			int x=fin(u),y=fin(v);
    			if(x!=y)fa[y]=x,sum--;
    		}
    	}
    	DREP(j,k,1)
    	{
    		int u=qu[j];
    		ans[j]=sum-j;
    		vis[u]=0;
    		EREP(i,u)
    		{
    			int v=e[i].v;
    			if(vis[v])continue;
    			int x=fin(u),y=fin(v);
    			if(x!=y)fa[y]=x,sum--;
    		}
    	}
    	printf("%d
    ",sum);
    	REP(i,1,k)printf("%d
    ",ans[i]);
    }
    
    int main()
    {
    	init();
    	doing();
    	return 0;
    }
    
    
    
  • 相关阅读:
    大道至简阅读笔记01
    3.2-3.8 第三周总结
    全国疫情统计可视化地图 01
    数据爬取
    全国疫情统计可视化地图
    第3周总结
    第2周总结
    开课博客
    数组
    从小工到专家 读后感2
  • 原文地址:https://www.cnblogs.com/gzy-cjoier/p/7523751.html
Copyright © 2020-2023  润新知