求调可持久化fhq treap
查看原帖
求调可持久化fhq treap
538609
Neutralized楼主2022/2/11 10:22

提交记录
貌似所有 WA\tt \color{red}WA 的点都是read -, expected 2(((
之前push_down新建的是父亲节点然后就爆灵了
看TJ说建儿子节点 然而 WA\tt \color{red}WA 50pts(
求帮♂帮

#include <bits/stdc++.h>
#define ri register int
#define MAXN 50000001
#define sti static int
#define ll long long
#define u32 unsigned int
using namespace std;

inline void Syncwithme(){
    ios::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL);
}

namespace Mt19937{
    #define TIME chrono::system_clock::now().time_since_epoch().count()
    #ifdef debug
    u32 Seed=114514;
    #else
    u32 Seed=TIME;
    #endif
    mt19937 rnd(Seed);
}; using namespace Mt19937;

namespace Persistable_Fhq{
    sti root[1000011],siz[MAXN];
	ll tot;
    sti val[MAXN],son[MAXN][2];
    ll sum[MAXN];
    sti tag[MAXN];
    static u32 pr[MAXN];

    #define swp(a,b) a^=b^=a^=b
    inline void update(int x){
        siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;
        sum[x]=sum[son[x][0]]+sum[son[x][1]]+val[x];
    }
    inline void sync(int now,int lst){
        tie(val[now],siz[now],son[now][0],son[now][1],pr[now],sum[now],tag[now])
       =tie(val[lst],siz[lst],son[lst][0],son[lst][1],pr[lst],sum[lst],tag[lst]);
    } //??STL??
    inline int create(int x){
        ri ret=++tot;
        val[ret]=x,siz[ret]=1;
        sum[ret]=x,tag[ret]=0;
        pr[ret]=rnd();
        return ret;
    }
    inline void push_down(int x){
        if(!tag[x]) return;
        if(son[x][0]){
        	ri New=++tot;
        	sync(New,son[x][0]);
        	son[x][0]=New;
		}
		if(son[x][1]){
        	ri New=++tot;
        	sync(New,son[x][1]);
        	son[x][1]=New;
		}
        tag[son[x][0]]^=1,tag[son[x][1]]^=1;
        swp(son[x][0],son[x][1]),tag[x]=0;
    }
    #define Pii pair<int,int>
    inline Pii split(int now,int k){
        if(!now) return {0,0};
        register Pii ret(0,0);
        ri New=++tot;
        push_down(now);
		sync(New,now);
        if(k>=siz[son[New][0]]+1){
            ret=split(son[New][1],k-siz[son[New][0]]-1);
            son[New][1]=ret.first;
            update(New),ret.first=New;
        } else{
            ret=split(son[New][0],k);
            son[New][0]=ret.second;
            update(New),ret.second=New;
        } return ret;
    }
    inline int merge(int l,int r){
        if(!l||!r) return l|r;
        if(pr[l]<pr[r]){
        	push_down(l);
            son[l][1]=merge(son[l][1],r);
            update(l); return l;
        } else{
        	push_down(r);
            son[r][0]=merge(l,son[r][0]);
            update(r); return r;
        }
    }
    inline void insert(int lst,int now,int p,int x){
        root[now]=root[lst];
        register Pii t1=split(root[now],p);
        root[now]=merge(merge(t1.first,create(x)),t1.second);
    }
    inline void erase(int lst,int now,int p){
        root[now]=root[lst];
        register Pii t1=split(root[now],p-1);
        register Pii t2=split(t1.second,1);
        if(!t2.first) return;
        t2.first=merge(son[t2.first][0],son[t2.first][1]);
        root[now]=merge(t1.first,merge(t2.first,t2.second));
    }
    inline void reverse(int lst,int now,int l,int r){
        root[now]=root[lst];
        register Pii t1=split(root[now],l-1);
        register Pii t2=split(t1.second,r-l+1);
        tag[t2.first]^=1;
        root[now]=merge(t1.first,merge(t2.first,t2.second));
    }
    inline int query(int lst,int now,int l,int r){
        root[now]=root[lst];
        register Pii t1=split(root[now],l-1);
        register Pii t2=split(t1.second,r-l+1);
        ri ret=sum[t2.first];
        root[now]=merge(t1.first,merge(t2.first,t2.second));
        return ret;
    }
}; using namespace Persistable_Fhq;

inline void debug(int x){
	if(!x)return;
	debug(son[x][0]),
	cout<<val[x]<<" ",
	debug(son[x][1]);
}
inline void DeepDarkFantasy(int v){
	cout<<"----DEBUG!----"<<endl;
	debug(root[v]),cout<<endl;
	cout<<"----ENDDE.----"<<endl;
}
const int inf=2147483647;
signed main()
{
    Syncwithme();
    //freopen("std.in","r",stdin);
    //freopen("mine.out","w",stdout);
    ri n,v,opt,l,r,id(0);
	register ll lst(0);
    cin>>n;
    while(n--){
        cin>>v>>opt;
        //DeepDarkFantasy(v);
        if(opt==1){
            cin>>l>>r;
            l^=lst,r^=lst;
            insert(v,++id,l,r);
        } else if(opt==2){
            cin>>l; l^=lst;
            erase(v,++id,l);
        } else if(opt==3){
            cin>>l>>r;
            l^=lst,r^=lst;
            reverse(v,++id,l,r);
        } else{
            cin>>l>>r;
            l^=lst,r^=lst;
            lst=query(v,++id,l,r);
            cout<<lst<<endl;
        }
    }
    return 0;
}
2022/2/11 10:22
加载中...