zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    2021年通达信指标公式大全,值得收藏!
    网络兼职?威客?为什么我会觉得网络兼职,威客会是人生中应该具备的一种能力!
    SeMusic 音乐网站源代码,PHP音乐系统,人人都是站长人人都可副业创业!
    JavaScript 查看图片,带缩放放大效果
    JS (javascript) 计算循环当前时间,javascript 时间钟表
    关键词被冷藏?关键词没排名?任务网站长们该何去何从?
    关键词任务网被K,对于任务网该何去何从?我认为任务网存活只有一条出路!
    C3属性的轮播图(持续更新)
    自己写的文字轮播(简陋版)
    带锁的3D切割轮播图
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Contest20190820T3.html
Copyright © 2011-2022 走看看