FHQ-Treap 0pts 求助

P3391 【模板】文艺平衡树

```cpp #include<bits/stdc++.h> using namespace std; //P3391 const int N=1e6+10; #define fup(l,r) for(int i=l;i<=r;i++) //用静态数组来模拟树 int cnt,root; std::mt19937 rnd(233); struct node{ int val,pri,ls,rs,size,lazy; }t[N]; int newNode(int x){ t[++cnt]={x,rnd(),0,0,1,0};//初始化一个新结点 return cnt; } void update(int u){ t[u].size=t[t[u].ls].size+t[t[u].rs].size+1; } //懒标记下移 void pushdown(int u){ if(t[u].lazy){ swap(t[u].ls,t[u].rs); t[t[u].ls].lazy ^= 1; t[t[u].rs].lazy ^= 1; t[u].lazy=0;//清空懒标记 } } //排名分裂--按顺序分裂 void Split(int u,int x,int& L,int& R){ if(u==0){ L=R=0; return; } pushdown(u); if(t[t[u].ls].size+1<=x){ L=u; Split(t[u].rs,x-(t[t[u].ls].size+1),t[u].rs,R); } else{ R=u; Split(t[u].ls,x,L,t[u].ls); } update(u); } int Merge(int L,int R){ if(L==0||R==0) return L+R; if(t[L].pri>t[R].pri){ pushdown(L); t[L].rs=Merge(t[L].rs,R); update(L); return L; } else{ pushdown(R); t[R].ls=Merge(L,t[R].ls); update(R); return R; } } //中序遍历 void inorder(int u){ if(u==0) return ; pushdown(u); inorder(t[u].ls); printf("%d ",t[u].val); inorder(t[u].rs); } int x,y,l,r,p; int main(){ int n,m; cin>>n>>m; fup(1,n){ root=Merge(root,newNode(i)); } while(m--){ scanf("%d%d",&x,&y); Split(root,x-1,l,p); Split(p,y-x+1,p,r); t[p].lazy^=1; root=Merge(l,Merge(p,r)); } inorder(root); return 0; } `````` 以上是我的代码,@\_cyh_ 你可以参考一下。
by ACcepted917 @ 2024-06-15 20:29:30


[评测结果](https://www.luogu.com.cn/record/162270753)
by ACcepted917 @ 2024-06-15 20:32:04


@[ACcepted917](/user/924648) 已过,谢谢
by _cyh_ @ 2024-06-15 20:37:06


已关
by _cyh_ @ 2024-06-15 20:37:35


|