TLE求助
查看原帖
TLE求助
139445
Infinempty楼主2020/12/31 16:12

我把dep和fa全部扔到一个内存池里,然后修改完按秩合并之后吸氧第五个点从900->400,然后第八个点照T无误,Orz救救孩子吧

https://www.luogu.com.cn/record/44458474

#include<bits/stdc++.h>

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr)
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define mkp make_pair
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double ld;

const ll LINF=2e18;
const ll MOD=1e9+7;
const int INF=0x3f3f3f3f;
const int MAXN=200050;

struct node{
	int val;
	int l,r;
}tr[MAXN*80];
int rootfa[MAXN],rootdep[MAXN],cnt=0,n;
inline int read() 
{
	register int x=0,o=0;register char ch=getchar();
	while(ch!='-'&&(ch<'0'||'9'<ch)) ch=getchar();
	if(ch=='-') o=1,ch=getchar();
	while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	return o?-x:x;
}
void build(int &id,int lb,int rb){
	id=++cnt;
	if(lb>=rb){
		tr[id].val=lb;
		return;
	}
	int mid=(lb+rb)>>1;
	build(tr[id].l,lb,mid);
	build(tr[id].r,mid+1,rb);
}
int query(int id,int x,int lb,int rb){
	if(lb>=rb)return tr[id].val;
	int mid=(lb+rb)>>1;
	if(x<=mid)return query(tr[id].l,x,lb,mid);
	else return query(tr[id].r,x,mid+1,rb);
}
int find(int id,int x){
	int fath=query(id,x,1,n);
	return fath==x?x:find(id,fath);
}
void modify(int &id,int pre,int x,int val,int lb,int rb){
	id=++cnt;
	tr[id].l=tr[pre].l;
	tr[id].r=tr[pre].r;
	if(lb>=rb){
		tr[id].val=val;
		return;
	}
	int mid=(lb+rb)>>1;
	if(x<=mid)modify(tr[id].l,tr[pre].l,x,val,lb,mid);
	else modify(tr[id].r,tr[pre].r,x,val,mid+1,rb);
}
void add(int id,int x,int lb,int rb){
	if(lb>=rb){
		tr[id].val++;
		return;
	}
	int mid=(lb+rb)>>1;
	if(x<=mid)add(tr[id].l,x,lb,mid);
	else add(tr[id].r,x,mid+1,rb);
}
void merge(int now,int pre,int x,int y){
	int fax=find(rootfa[pre],x),fay=find(rootfa[pre],y);
	if(fax==fay){
		rootfa[now]=rootfa[pre];
		rootdep[now]=rootdep[pre];
		return;
	}
	int depx=query(rootdep[pre],fax,1,n),depy=query(rootdep[pre],fay,1,n);
	if(depx!=depy){
		if(depx>depy){
			swap(fax,fay);
			swap(depx,depy);
		}
		modify(rootfa[now],rootfa[pre],fax,fay,1,n);
		//modify(rootdep[now],rootdep[pre],fax,depy,1,n);
	}else{
		modify(rootfa[now],rootfa[pre],fax,fay,1,n);
		modify(rootdep[now],rootdep[pre],fay,depy+1,1,n);
	}
}
void solve(int T){
	int m;
	n=read(),m=read();
	build(rootfa[0],1,n);
	int o,x,y;
	for(int i=1;i<=m;i++){
		o=read();
		if(o==1){
			x=read(),y=read();
			merge(i,i-1,x,y);
		}else if(o==2){
			x=read();
			rootfa[i]=rootfa[x];
			rootdep[i]=rootdep[x];
		}else if(o==3){
			x=read(),y=read();
			rootfa[i]=rootfa[i-1];
			rootdep[i]=rootdep[i-1];
			int fax=find(rootfa[i],x),fay=find(rootfa[i],y);
			if(fax==fay)puts("1");
			else puts("0");
			//printf("%d\n",find(rootfa[i],x)==find(rootfa[i],y)?1:0);
		}
	}
}
signed main(){
	//IOS;
	int t=1;
	//scanf("%d",&t);
	for(int i=1;i<=t;i++){
		solve(i);
	}
}
2020/12/31 16:12
加载中...