FHQ-Treap样例已过,0pts求调
查看原帖
FHQ-Treap样例已过,0pts求调
661913
liwenxi1145144444楼主2025/7/8 15:24
#include<bits/stdc++.h>
#define int long long 
#define ls(k) tree[k].ch[0]
#define rs(k) tree[k].ch[1]
using namespace std;
const int N=1e5+5;
int n,tot,t,root;
struct node{
	int val,cnt,pri,laz,ch[2];
}tree[N];
mt19937 rnd(time(0));
int newnode(int x){
	tot++;
	tree[tot]={x,1,rnd(),0,0};
	return tot;
}
void pushup(int x){
	tree[x].cnt=tree[ls(x)].cnt+tree[rs(x)].cnt+1;
}
void pushdown(int x){
	if(x&&tree[x].laz){
		swap(ls(x),rs(x));
		tree[ls(x)].laz^=1;
		tree[rs(x)].laz^=1;
		tree[x].laz=0; 
	}
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	pushdown(x);
	pushdown(y);
	if(tree[x].pri<tree[y].pri){
		rs(x)=merge(rs(x),y);
		pushup(x);
		return x;
	}
	ls(y)=merge(x,ls(y));
	pushup(y);
	return y;
}
void split(int now,int &x,int &y,int k){
	if(now==0){
		x=y=0;
		return ;
	}
	pushdown(now); 
	if(tree[now].val<=k){
		x=now;
		split(rs(now),rs(x),y,k);
	}else{
		y=now;
		split(ls(now),x,ls(y),k);
	}
	pushup(now);
}
void rev(int l,int r){
	int x,y,z;
	split(root,x,y,l-1);
	split(y,y,z,r-l+1);
	tree[y].laz^=1;
	root=merge(x,merge(y,z));
}
void ins(int x){
	int p,q;
	split(root,p,q,x);
	root=merge(p,merge(newnode(x),q));
}
void hpr(int now){
	if(!now){
		return ;
	}
	pushdown(now);
	hpr(ls(now));
	cout<<tree[now].val<<" ";
	hpr(rs(now));
}
signed main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		ins(i);
	}
	while(t--){
		int l,r;
		cin>>l>>r;
		rev(l,r);
	}
	hpr(root);
	return 0;
}
2025/7/8 15:24
加载中...