MLE求助
查看原帖
MLE求助
373757
never_AK楼主2022/12/19 12:29
#include<bits/stdc++.h>
//#define int long long //这个已经去掉了,怎么卡常,太小了RE,太大了MLE
using namespace std;
const long long maxn=1e5+10;
struct{
	int l,r,fa;
}tree[maxn*15];
int n,Q;
int visit = 1;
int tot; 
int insert(int p,int l,int r,int x){
	if(p == 0){
		p = ++tot;
	}
	if(l == r){
		tree[p].fa = l;
		return p;
	}
	int ls = tree[p].l;
	int rs = tree[p].r;
	int mid = l+r >> 1;
	if(x <= mid){
		tree[p].l = insert(ls,l,mid,x);
	}
	else{
		tree[p].r = insert(rs,mid+1,r,x);
	}
	return p;
}
int find(int p,int l,int r,int x){
	if(p == 0) return 0;
	if(l == r){
		if(tree[p].fa == l){
			return tree[p].fa;
		}
		else return tree[p].fa = find(visit,1,n,tree[p].fa);
	}
	int ls = tree[p].l;
	int rs = tree[p].r;
	int mid = l+r >> 1;
	if(x <= mid) return find(ls,l,mid,x);
	else return find(rs,mid+1,r,x);
}
int repair(int a,int b,int l,int r,int u,int v){
	if(a == 0){
		a = ++tot;
	}
	if(l == r){
		tree[a].fa = v;
		return a;
	}
	int ls = tree[a].l;
	int rs = tree[a].r;
	int lx = tree[b].l;
	int rx = tree[b].r;
	int mid = l+r >> 1;
	if(u <= mid){
		tree[a].l = repair(ls,lx,l,mid,u,v);
		tree[a].r = rx;
	}
	else{
		tree[a].l = ls;
		tree[a].r = (rs,rx,mid+1,r,u,v);
	}
	return a;
}
signed main()
{
	cin>>n>>Q;
	tot = n+1;
	for(int i=1;i<=n;i++){
		insert(1,1,n,i);
	}
	for(int i=1;i<=Q;i++){
		int op;
		scanf("%d",&op);
		if(op == 1){
			int x,y;
			scanf("%d %d",&x,&y);
			int fa_x = find(visit,1,n,x);
			int fa_y = find(visit,1,n,y);
			repair(i+1,visit,1,n,fa_x,fa_y);
			visit = i+1;
		}
		else if(op == 2){
			int k;
			scanf("%d",&k);
			visit = k+1;
		}
		else if(op == 3){
			int x,y;
			scanf("%d %d",&x,&y);
			int fa_x = find(visit,1,n,x);
			int fa_y = find(visit,1,n,y);
			repair(i+1,visit,1,n,fa_x,fa_x);
			visit = i+1;
			printf("%d\n",(fa_x == fa_y));
		}
	}
	return 0;
}
2022/12/19 12:29
加载中...