文艺平衡树求调
查看原帖
文艺平衡树求调
744895
liaoxingrui楼主2024/6/23 10:08
#include<bits/stdc++.h>
#define tmpl(x) tree[x].l
#define tmpr(x) tree[x].r
#define size(x) tree[x].siz
using namespace std;
const int N=1e5+5;
int n,m,l,r,tot,root;
bool flag[N];
struct Tree{
	int l,r,val,siz,next;
}tree[N];
inline void pushup(int node){
	tree[node].siz=size(tmpl(node))+size(tmpr(node))+1;
}
inline void pushdown(int node){
	flag[node]=false;
	flag[tmpl(node)]^=1;
	flag[tmpr(node)]^=1;
	swap(tree[node].l,tree[node].r);
}
inline void split(int node,int val,int &x,int &y){
	if(!node){
		x=0;
		y=0;
		return;
	}
	if(flag[node])
		pushdown(node);
	if(size(tmpl(node))<val){
		x=node;
		split(tmpr(node),val-size(tmpl(node))-1,tmpr(node),y);
	}
	else{
		y=node;
		split(tmpl(node),val,x,tmpl(node));
	}
	pushup(node);
}
inline int merge(int x,int y){
	if(!x||!y)
		return x+y;
	if(tree[x].next<=tree[y].next){
		if(flag[x])
			pushdown(x);
		tree[x].r=merge(tmpr(x),y);
		pushup(x);
		return x;
	}
	if(flag[y])
		pushdown(y);
	tree[y].l=merge(x,tmpl(y));
	pushup(y);
	return y;
}
inline void write(int node){
	if(!node)
		return;
	if(flag[node])
		pushdown(node);
	write(tmpl(node));
	cout<<tree[node].val<<" ";
	write(tmpr(node));
}
int main(){
	srand(time(0));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		tot++;
		tree[tot].siz=1;
		tree[tot].val=i;
		tree[tot].next=rand()%1000000007;
		root=merge(root,tot);
	}
	while(m--){
		cin>>l>>r;
		int x,y,z;
		split(root,l-1,x,y);
		split(y,r-l+1,y,z);
		flag[y]^=1;
		root=merge(merge(y,z),x);
	}
	write(root);
	return 0;
}

全wa

2024/6/23 10:08
加载中...