蒟蒻求助fhq treap 文艺平衡树 全WA
查看原帖
蒟蒻求助fhq treap 文艺平衡树 全WA
407604
Griseo_nya楼主2021/1/13 16:36
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
typedef pair<int,int> pr;
int tot,rt,n;
mt19937 randl(time(0)+(unsigned long long)(new char)); 
struct racism{
	int l,r,w,rank,size,tag;
}tre[maxn];
inline void pushup(int p){
	tre[p].size=tre[tre[p].l].size+tre[tre[p].r].size+1;
}
inline void pushdown(int u){
	swap(tre[u].l,tre[u].r);tre[tre[u].l].tag^=1;tre[tre[u].r].tag^=1;tre[u].tag=0;
}
inline pr split_by_value(int p,int w){
	if(!p)return make_pair(0,0);
	if(tre[p].tag)pushdown(p);
	if(tre[p].w<=w){
		pr s=split_by_value(tre[p].r,w);
		tre[p].r=s.first;
		pushup(p);
		return make_pair(p,s.second);
	}
	else{
		pr s=split_by_value(tre[p].l,w);
		tre[p].l=s.second;
		pushup(p);
		return make_pair(s.first,p);
	}
}
inline pr split_by_rank(int p,int w){
	if(!p)return make_pair(0,0);
	if(tre[p].tag)pushdown(p);
	if(tre[tre[p].l].size+1<=w){
		pr s=split_by_rank(tre[p].r,w-tre[tre[p].l].size-1);
		tre[p].r=s.first;
		pushup(p);
		return make_pair(p,s.second);
	}
	else {
		pr s=split_by_rank(tre[p].l,w);
		tre[p].l=s.second;
		pushup(p);
		return make_pair(s.first,p);
	}
}
inline int merge(int x,int y){
	if(!x||!y)return x+y;
	if(tre[x].rank<=tre[y].rank){
		if(tre[x].tag)pushdown(x);
		tre[x].r=merge(tre[x].r,y);
		pushup(x);
		return x;
	}
	else {
		if(tre[y].tag)pushdown(y);
		tre[y].l=merge(x,tre[y].l);
		pushup(y);
		return y;
	}
}
void print(int u){
	if(tre[u].tag)
		pushdown(u);
	if(tre[u].l)
		print(tre[u].l);
	printf("%d ",tre[u].w);
	if(tre[u].r)
		print(tre[u].r);
}
void insert(int w){
	tot++;
	tre[tot]=(racism){0,0,w,randl(),1,0};
	pr s=split_by_value(rt,w);
	rt=merge(merge(s.first,tot),s.second);
} 

//l,r,w,rank,size,tag
int main(){
	int m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		insert(i);
	}
	
	for(int i=1;i<=m;i++){
		int y,x;
		scanf("%d%d",&x,&y);
		pr s=split_by_rank(rt,y);
		pr s1=split_by_rank(s.first,x-1);
		swap(tre[s1.second].l,tre[s1.second].r);
		tre[s1.second].tag^=1;
		rt=merge(merge(s1.first,s1.second),s.second);
	}
	print(rt);
	return 0;
}
2021/1/13 16:36
加载中...