求助防火墙TLE48分
查看原帖
求助防火墙TLE48分
545835
TTpandaS楼主2023/8/20 16:58
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int x,y;
int R;
int key[N],siz[N],rk[N],son[N][2],lazy[N];
int cnt;
bool flag;
int newnode(int x){
	rk[x]=rand();
	key[x]=x;
	siz[x]=1;
	return x;
}
void pushdown(int rt){
	if(lazy[rt]){
		swap(son[rt][0],son[rt][1]);
		lazy[son[rt][0]]^=1;
		lazy[son[rt][1]]^=1;
		lazy[rt]=0;
	}
}
void pushup(int rt){
	siz[rt]=siz[son[rt][0]]+siz[son[rt][1]]+1;
}
int merge(int rt1,int rt2){
//	if(flag){
//		printf("\n%d %d",rt1,rt2);
//	}
	if(!rt1){
		return rt2;
	}
	if(!rt2){
		return rt1;
	}
	if(key[rt1]<key[rt2]){
		pushdown(rt1);
//		if(flag) puts("qwq");
		son[rt1][1]=merge(son[rt1][1],rt2);
		pushup(rt1);
		return rt1;
	}
	else{
		pushdown(rt2);
//		if(flag) puts("qaq");
		son[rt2][0]=merge(rt1,son[rt2][0]);
		pushup(rt2);
		return rt2;		
	}
}
pair<int,int> split(int rt,int y){
	pair<int,int> ans;
	if(!rt){
		return make_pair(0,0);
	}
	pushdown(rt);
	if(siz[son[rt][0]]+1<=y){
		ans=split(son[rt][1],y-(siz[son[rt][0]]+1));
		son[rt][1]=ans.first;
		ans.first=rt;
	}
	else{
		ans=split(son[rt][0],y);
		son[rt][0]=ans.second;
		ans.second=rt;
	}
	pushup(rt);
	return ans;
}
void swap_lr(int l,int r){
	pair<int,int> tmp1=split(R,y);
	pair<int,int> tmp2=split(tmp1.first,x-1);
	lazy[tmp2.second]^=1;
	R=merge(merge(tmp2.first,tmp2.second),tmp1.second);
}
void print(int rt){
	if(!rt){
		return;
	}
	pushdown(rt);
	print(son[rt][0]);
	printf("%d ",key[rt]);
	print(son[rt][1]);
}
signed main(){
//	freopen("P3391_4.in","r",stdin);
//	freopen("ans.out","w",stdout);
	srand(time(0));
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
//		printf("%d ",i);
//		if(i==43340){
//			flag=1;
//		}
		R=merge(R,newnode(i));
	}
	while(m--){
		scanf("%d %d",&x,&y);
		swap_lr(x,y);	
	}
	print(R);
	return 0;
}
/*

5 3
1 3
1 3
1 4

5 3
1 3
1 4
1 5

*/
2023/8/20 16:58
加载中...