我A了,fhq_treap。
评测记录
#include<bits/stdc++.h>
//P3391 【模板】文艺平衡树
//又名 fhq_treap 、文艺平衡树
using namespace std;
#define int long long
#define N 100010
struct Tree {
int ls,rs,siz,val,pri;
} tr[N];
int tot,root;
bool tag[N];
inline int NewNode(int val) {
tr[++tot]= {0,0,1,val,rand()};
return tot;
}
inline void updt(int pos) {
tr[pos].siz=tr[tr[pos].ls].siz+tr[tr[pos].rs].siz+1;
}
inline void pushdown(int pos) {
if(tag[pos]) {
tag[pos]=false;
swap(tr[pos].ls,tr[pos].rs);
tag[tr[pos].ls]^=true;
tag[tr[pos].rs]^=true;
}
}
void split_val(int val,int pos,int &x,int &y) {
if(!pos)x=y=0;
else {
pushdown(pos);
if(tr[pos].val<=val) {
x=pos;
split_val(val,tr[x].rs,tr[x].rs,y);
} else {
y=pos;
split_val(val,tr[y].ls,x,tr[y].ls);
}
updt(pos);
}
}
void split_rnk(int rnk,int pos,int &x,int &y) {
if(!pos)x=y=0;
else {
pushdown(pos);
int lsiz=tr[tr[pos].ls].siz;
if(lsiz+1<=rnk) {
x=pos;
split_rnk(rnk-lsiz-1,tr[x].rs,tr[x].rs,y);
} else {
y=pos;
split_rnk(rnk,tr[y].ls,x,tr[y].ls);
}
updt(pos);
}
}
int merge(int x,int y) { //保证第一个的权值小于第二个
if(!x||!y)return x+y;
else {
pushdown(x);
pushdown(y);
if(tr[x].pri<tr[y].pri) {
tr[x].rs=merge(tr[x].rs,y);
updt(x);
return x;
} else {
tr[y].ls=merge(x,tr[y].ls);
updt(y);
return y;
}
}
}
void Insert(int pos,int val) {
int x,y;
split_val(val,pos,x,y);
root=merge(merge(x,NewNode(val)),y);
}
void reverse(int l,int r){
int x,y,z;
split_rnk(l-1,root,x,y);
split_rnk(r-l+1,y,y,z);
tag[y]^=true;
y=merge(y,z);
root=merge(x,y);
}
void dfs(int pos){
if(!pos)return;
else{
pushdown(pos);
dfs(tr[pos].ls);
printf("%d ",tr[pos].val);
dfs(tr[pos].rs);
}
}
int n,m;
signed main() {
srand(time(0));
cin>>n>>m;
for(int i=1;i<=n;i++){
Insert(root,i);
}
while(m--){
int l,r;
scanf("%d%d",&l,&r);
reverse(l,r);
}
dfs(root);
return 0;
}
/*
freopen(".in","r",stdin);
freopen(".out","w",stdout);
*/
样例测试:
输入:
5 3
1 3
1 3
1 4
输出:
(正常运行:)
1
1
1
(还能继续输)
(调试:)
4 3 2 1 5