• 幼儿园战争


    题面传送门

    灵魂出窍并查集,修改后留一个空壳以确保家人们的团结

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    
    inline void input(int &x){
    	int ans=0,f=1;
    	char c=getchar();
    	while(c>'9'||c<'0'){
    		if(c=='-')f=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){
    		ans=(ans<<1)+(ans<<3)+(c-48);
    		c=getchar();
    	}
    	x=ans*f;
    }
    
    inline void output(int x){
    	if(x<0)x=-x,putchar('-');
    	if(x>9)output(x/10);
    	putchar(x%10+48);
    }
    
    inline void writeln(int x){
    	output(x);
    	putchar('
    ');
    }
    
    int n,m,fa[1000005],size[1000005],now[1000005],tot,cnt;
    
    inline int getfa(int v){return fa[v]==v?v:fa[v]=getfa(fa[v]);}
    
    int main(){
    	int T;
    	input(T);
    	for(int emm=1;emm<=T;emm++){
    		printf("Case #%d:
    ",emm);
    		input(n);input(m);
    		for(int i=1;i<=n;i++){
    			fa[i]=i;
    			size[i]=1;
    			now[i]=i;
    		}
    		tot=n;cnt=n;
    		for(int i=1;i<=m;i++){
    			char s[10];
    			scanf("%s",s);
    			if(s[0]=='q'){
    				writeln(tot);
    			}
    			else if(s[0]=='f'){
    				int x,y,yuanx,yuany,fax,fay;
    				input(yuanx);input(yuany);x=now[yuanx];y=now[yuany];
    				fax=getfa(x);fay=getfa(y);
    				if(fax==fay)continue;
    				if(size[fax]==size[fay]){
    					printf("Either is winner!
    ");
    				}
    				else if(size[fax]>size[fay]){
    					printf("%d is winner!
    ",yuanx);
    					fa[fay]=fax;
    					size[fax]+=size[fay];
    					tot--;
    				}
    				else if(size[fay]>size[fax]){
    					printf("%d is winner!
    ",yuany);
    					fa[fax]=fay;
    					size[fay]+=size[fax];
    					tot--;
    				}
    			}
    			else if(s[0]=='t'){
    				int x,y,yuanx,yuany,fax,fay;
    				input(yuanx);input(yuany);x=now[yuanx];y=now[yuany];
    				fax=getfa(x);fay=getfa(y);
    				int next=++cnt;
    				fa[next]=fax;
    				size[fax]++;
    				size[fay]--;
    				if(size[fay]==0)tot--;
    				now[yuany]=next;
    			}
    			else if(s[0]=='r'){
    				int x,yuanx,fax;
    				input(yuanx);x=now[yuanx];
    				fax=getfa(x);
    				if(size[fax]==1)continue;
    				int next=++cnt;
    				fa[next]=next;
    				size[next]=1;
    				size[fax]--;
    				tot++;
    				now[yuanx]=next;
    			}
    			/*
    			putchar('a');
    			for(int i=1;i<=n;i++){
    				printf("%d,%d ",size[getfa(now[i])],getfa(now[i]));
    			}
    			putchar('
    ');
    			*/
    		}
    	}
    }
    
  • 相关阅读:
    hdu 2594 Simpsons’ Hidden Talents
    hdu 1358 Period
    hdu 3746 Cyclic Nacklace
    理解KMP算法
    ural 1039 Anniversary Party
    ural 1018 Binary Apple Tree
    RowDataBound事件
    aspxGridview 根据单元格值得不同,设置单元格字体的颜色(设置和读取值)
    Asp.Net中GridView加入鼠标滑过的高亮效果和单击行颜色改变
    GridView的行颜色高亮显示(包括满足条件的行)
  • 原文地址:https://www.cnblogs.com/Y15BeTa/p/11617704.html
Copyright © 2020-2023  润新知