96分 TLE on #14 求调
查看原帖
96分 TLE on #14 求调
602833
kczw楼主2024/6/6 18:53

代码

#include<bits/stdc++.h>

using namespace std;

const int N(1e5+5);

int n,m;
int cnt;
int root[N<<1];

struct tree{
	int l,r;
	int fa,dep;
}tr[N<<7];

inline void build(int &p,int l,int r){
	
	p=++cnt;
	
	if(l==r){
		tr[p].fa=l;
		return;
	}
	
	build(tr[p].l,l,l+r>>1);
	build(tr[p].r,(l+r>>1)+1,r);
	
	return;
}

inline void modify_fa(int &p,int l,int r,int x,int v){
	
	tr[++cnt]=tr[p];
	p=cnt;
	
	if(l==r){
		tr[p].fa=v;
		return;
	}
	
	if(x<=l+r>>1)
		modify_fa(tr[p].l,l,l+r>>1,x,v);
	else
		modify_fa(tr[p].r,(l+r>>1)+1,r,x,v);
}
inline void modify_dep(int &p,int l,int r,int x,int v){
	
	tr[++cnt]=tr[p];
	p=cnt;
	
	if(l==r){
		tr[p].dep=v;
		return;
	}
	
	if(x<=l+r>>1)
		modify_dep(tr[p].l,l,l+r>>1,x,v);
	else
		modify_dep(tr[p].r,(l+r>>1)+1,r,x,v);
}

inline int fa(int p,int l,int r,int x){
	
	if(l==r)
		return p;
	
	if(x<=l+r>>1)
		return fa(tr[p].l,l,l+r>>1,x);
	else
		return fa(tr[p].r,(l+r>>1)+1,r,x);
}

inline int fidfa(int k,int x){
	int fax=fa(root[k],1,n,x);
	if(x==tr[fax].fa)
		return fax;
	return fidfa(k,tr[fax].fa);
}

inline void hb(int k,int x,int y){
	
	int fax=fidfa(k,x);
	int fay=fidfa(k,y);
	
	if(tr[fax].fa!=tr[fay].fa){
		
		if(tr[fax].dep<tr[fay].dep)
			swap(fax,fay);
		
		modify_fa(root[k],1,n,tr[fay].fa,tr[fax].fa);
		modify_dep(root[k],1,n,tr[fax].fa,tr[fay].dep+(tr[fax].dep==tr[fay].dep));
	}
		
	return;
}

int main(){

	scanf("%d%d",&n,&m);
	
	build(root[0],1,n);
	
	for(int i=1,op,a,b;i<=m;i++){
		
		scanf("%d%d",&op,&a);
		
		root[i]=root[i-1];
			
		if(op==1){
			scanf("%d",&b);
			hb(i,a,b);
		}
		else if(op==2)
			root[i]=root[a];
		else{
			scanf("%d",&b);
			
			int faa=fidfa(i,a);
			int fab=fidfa(i,b);
			
			printf("%d\n",(tr[faa].fa==tr[fab].fa));
			root[i]=root[i-1];
		}
		
	}
	return 0;
} 
2024/6/6 18:53
加载中...