fhq-treap 求调
查看原帖
fhq-treap 求调
246331
mystic_qwq楼主2024/4/11 17:35

本代码在本地可以通过样例,但是在洛谷IDE里样例过不了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
random_device rd;
mt19937 Rand(rd());
struct{
  int ls,rs,key,sz,val;
  bool tag;
}tr[N];
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define key(x) tr[x].key
#define sz(x) tr[x].sz
#define val(x) tr[x].val
#define tag(x) tr[x].tag
//#define Ls(x) tr[ls(x)]
//#define Rs(x) tr[rs(x)]
int root,T1,T2,T3,ck;
int New(int val){
  return tr[++ck]={0,0,Rand(),1,val,0},ck;
}
#define push_up(h) sz(h)=sz(ls(h))+1+sz(rs(h))
#define push_down(h) if(tag(h))swap(ls(h),rs(h)),tag(ls(h))^=bool(ls(h)),tag(rs(h))^=bool(rs(h)),tag(h)=0;
void split(int h,int k,int&x,int&y){
  if(!h) return void(x=y=0);
  push_down(h);
  register int tmp=sz(ls(h))+1;
  if(k==tmp) x=h,y=rs(h),rs(h)=0;
  else if(k<tmp) split(ls(h),k,x,ls(y=h));
  else split(rs(h),k,rs(x=h),y);
  push_up(h);
}
inline int merge(int u,int v){
  if(!u||!v) return u|v;
  if(key(u)<key(v)){
    push_down(u);
    rs(u)=merge(rs(u),v);
    return push_up(u),u;
  }
  push_down(v);
  ls(v)=merge(u,ls(v));
  return push_up(v),v;
}
void reverse(int l,int r){
  split(root,l-1,T1,T2);
  split(T2,r-l+1,T2,T3);
  tag(T2)^=1;
  root=merge(merge(T1,T2),T3);
}
inline void dfs(int h){
  if(!h) return;
  push_down(h);
  dfs(ls(h)),cout<<val(h)<<' ',dfs(rs(h));
}
main(){
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;++i) root=merge(root,New(i));
  for(int u,v;m--;reverse(u,v)) cin>>u>>v;
  dfs(root);
}
2024/4/11 17:35
加载中...