• 【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)


    可持久化并查集

    显然是可持久化并查集裸题吧。。。

    就是题面长得有点恶心,被闪指导狂喷。

    对于(K)操作,直接(O(1))赋值修改。

    对于(R)操作,并查集上直接连边。

    对于(T)操作,先询问当前是否连通,若联通再询问(t)次操作前是否连通。

    代码

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int 
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 300000
    #define LN 20
    #define swap(x,y) (x^=y^=x^=y) 
    using namespace std;
    int n;
    class FastIO
    {
    	private:
    		#define FS 100000
    		#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
    		#define tn (x<<3)+(x<<1)
    		#define D isdigit(c=tc())
    		char c,*A,*B,FI[FS];
    	public:
    		I FastIO() {A=B=FI;}
    		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
    		Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
    		Tp I void readc(Ty& x) {W(isspace(x=tc()));}
    }F;
    class PersistentUnionFindSet//可持久化并查集
    {
    	private:
    		#define LT l,mid,O[rt].S[0]
    		#define RT mid+1,r,O[rt].S[1]
    		int n,Nt,Rt[N+5];struct node {int f,g,S[2];}O[N*LN<<1];
    		I int getfa(CI rt,CI x) {RI t=Qry(x,1,n,rt);return O[t].f^x?getfa(rt,O[t].f):t;}//找祖先
    		I void Build(CI l,CI r,int& rt)//建树
    		{
    			if(rt=++Nt,l==r) return (void)(O[rt].f=l);RI mid=l+r>>1;
    			Build(LT),Build(RT);
    		}
    		I int Qry(CI x,CI l,CI r,CI rt)//询问
    		{
    			if(!rt) return 0;if(l==r) return rt;RI mid=l+r>>1;
    			return x<=mid?Qry(x,LT):Qry(x,RT);
    		}
    		I void Upt(CI x,CI f,CI l,CI r,int& rt)//修改父亲
    		{
    			if(O[++Nt]=O[rt],rt=Nt,l==r) return (void)(O[rt].f=f);RI mid=l+r>>1;
    			x<=mid?Upt(x,f,LT):Upt(x,f,RT);
    		}
    		I void Add(CI x,CI l,CI r,int& rt)//将深度加1
    		{
    			if(O[++Nt]=O[rt],rt=Nt,l==r) return (void)++O[rt].g;RI mid=l+r>>1;
    			x<=mid?Add(x,LT):Add(x,RT);
    		}
    	public:
    		I void Init(CI _n) {Build(1,n=_n,Rt[0]);}
    		I bool Identify(CI v,CI x,CI y) {return getfa(Rt[v],x)==getfa(Rt[v],y);}//判断是否连通
    		I void Union(CI v,CI x,CI y)//按秩合并
    		{
    			Rt[v]=Rt[v-1];RI fx=getfa(Rt[v],x),fy=getfa(Rt[v],y);if(fx==fy) return;
    			O[fx].g<O[fy].g&&swap(fx,fy),Upt(O[fy].f,O[fx].f,1,n,Rt[v]),
    			O[fx].g==O[fy].g&&(Add(O[fx].f,1,n,Rt[v]),0);
    		}
    }U;
    int main()
    {
    	freopen("history.in","r",stdin),freopen("history.out","w",stdout);
    	RI Qt,x,y,z,k=0,op=0,cnt=0;char t;F.read(n,Qt),U.Init(n);W(Qt--) switch(F.readc(t),t)
    	{
    		case 'K':F.read(x),k=x;break;//K操作
    		case 'R':F.read(x,y),U.Union(++cnt,(x+op*k)%n+1,(y+op*k)%n+1);break;//R操作
    		case 'T'://T操作
    			if(F.read(x,y,z),++x,++y,x==y||!U.Identify(cnt,x,y)) {puts("N"),op=1;continue;}
    			cnt<=z||!U.Identify(cnt-z,x,y)?(puts("Y"),op=0):(puts("N"),op=1);break;
    	}return 0;
    }
    
  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Contest20190820T3.html
Copyright © 2020-2023  润新知