fhq treap 全wa
查看原帖
fhq treap 全wa
1107030
just_do_it_now楼主2024/7/24 15:59

求救

#include <bits/stdc++.h>
#define long long int
using namespace std;
const int N=1e5+10;
struct treap{
	int left,right;
	int val,heap;
	int siz;
	int lazy;
}tree[N];
int p,root;
struct node{
	int x,y;
};
void upd(int x){
	tree[x].siz=tree[tree[x].left].siz+tree[tree[x].right].siz+1;
}
void push_down(int x){
	swap(tree[x].left,tree[x].right);
	tree[tree[x].left].lazy^=1;
	tree[tree[x].right].lazy^=1;
	tree[x].lazy=0; 
}
node split(int now,int v){
	if (!now)return {0,0};
	int x,y;
	if (tree[now].lazy)push_down(now);
	if (tree[now].val<=v){
		x=now;
		node t1=split(tree[now].right,v);
		y=t1.y;
		tree[now].right=t1.x;
	}else{
		y=now;
		node t2=split(tree[now].left,v);
		x=t2.x;
		tree[now].left=t2.y;
	}
	upd(now);
	return {x,y};
}
int merge(int x,int y){
	if (!x||!y)return x+y;
	if (tree[x].heap<tree[y].heap){
		if (tree[x].lazy)push_down(x);
		tree[x].right=merge(tree[x].right,y);
		upd(x);
		return x;
	}else{
		if (tree[y].lazy)push_down(y);
		tree[y].left=merge(x,tree[y].left);
		upd(y);
		return y;
	}
}
int create(int x){
	tree[++p].siz=1;
	tree[p].val=x;
	tree[p].heap=rand()*rand();
	return p;
}
void reverse_(int l,int r){
	node t1=split(root,l-1);
	node t2=split(t1.y,r-l+1);
	tree[t2.x].lazy^=1;
	root=merge(merge(t1.x,t2.x),t2.y);
}
void out_treap(int x){
	if (tree[x].lazy)push_down(x);
	if (tree[x].left)out_treap(tree[x].left);
	cout<<x<<" ";
	if (tree[x].right)out_treap(tree[x].right);
}
int n,m;
signed main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++)
		root=merge(root,create(i));
	for (int i=1;i<=m;i++){
		int l,r;
		cin>>l>>r;
		reverse_(l,r);
	}
	out_treap(root);
	return 0;
} 
2024/7/24 15:59
加载中...