随机化TLE92pts求助
查看原帖
随机化TLE92pts求助
299922
atarashiTLE楼主2023/9/22 10:40

rt.稳定TLE on #11 #14用时稳定约2s

本机O2稳过

#include<bits/stdc++.h>
#define int long long
#define N 100010
using namespace std;
struct sgm_t{
	int nw,ls,rs,val;
}a[N<<5];
int n,m,op,aa,bb,arr[N],root[N],sz;
void pushup(int nw){a[nw].val=a[a[nw].ls].val+a[a[nw].rs].val;}
void bui(int nw,int l,int r){
	a[nw].ls=(nw<<1);a[nw].rs=(nw<<1)+1;
	sz=max(sz,nw);
	if(l==r)
		a[nw].val=arr[l];
	else{
		bui((nw<<1),l,(l+r)>>1);
		bui((nw<<1)+1,1+((l+r)>>1),r);
		pushup(nw);
	}
}
int fix(int nw,int pos,int v,int l,int r){
	a[++sz]=a[nw];
	int ret=sz;
	if(l==r)
		a[ret].val=v;
	else if(pos>(l+r)>>1)
		a[ret].rs=fix(a[nw].rs,pos,v,1+((l+r)>>1),r);
	else a[ret].ls=fix(a[nw].ls,pos,v,l,(l+r)>>1);
	return ret;
}
int wha(int nw,int pos,int l,int r){
	if(l==r)
		return a[nw].val;
	else if(pos>(l+r)>>1)
		return wha(a[nw].rs,pos,1+((l+r)>>1),r);
	return wha(a[nw].ls,pos,l,(l+r)>>1);
}
int findfa(int a,int ver){
	int t=wha(root[ver],a,1,n);
	if(t==a)return a;
	else{
		t=findfa(t,ver);
		return t;
	}
}
int mrg(int a,int b,int ver){
	if(rand()%2)
		return fix(root[ver],findfa(min(a,b),ver),findfa(max(a,b),ver),1,n);
	return fix(root[ver],findfa(max(a,b),ver),findfa(min(a,b),ver),1,n);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie();cout.tie();
	srand(time(NULL));
	cin>>n>>m;
	for(int i=1;i<=n;i++)arr[i]=i;
	n=1<<(int)(1e-6+ceil(1e-6+log(n)/log(2)));
	bui(1,1,n);root[0]=1;
	for(int i=1;i<=m;i++){
		cin>>op>>aa;
		if(op==1){
			cin>>bb;root[i]=mrg(aa,bb,i-1);
		}
		else if(op==2)
			a[root[i]=++sz]=a[root[aa]];
		else{
			a[root[i]=++sz]=a[root[i-1]];
			cin>>bb;
			cout<<(findfa(aa,i-1)==findfa(bb,i-1))<<endl; 
		}
	}
	return 0;
}
2023/9/22 10:40
加载中...