zoukankan      html  css  js  c++  java
  • P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap

    P5055 【模板】可持久化文艺平衡树

    链接

    luogu

    思路

    可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久。以前以为很难一直没看,就是个板子。

    错误

    t[++num].sum=x;t[num].val=x;
    t[++num].sum=t[num].val=x;
    

    这两句话居然不一样。
    我靠我靠我靠,调试了一下午。

    代码

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int _=2e5+7;
    ll read() {
        ll x=0,f=1;char s=getchar();
        for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
        for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
        return x*f;
    }
    namespace fhq_treap {
        #define ls t[u].ch[0]
        #define rs t[u].ch[1]
        int num;
        struct node {
            int ch[2],siz,pri,lazy;
            ll val,sum;
        }t[_*80];
        int make_node(ll x) {
            t[++num].sum=x;t[num].val=x;
            t[num].pri=rand(),t[num].siz=1;
            return num;
        }
        void pushup(int u) {
            t[u].siz=t[ls].siz+t[rs].siz+1;
            t[u].sum=t[ls].sum+t[rs].sum+t[u].val;
        }
        int copy_node(int u) {t[++num]=t[u];return num;}
        void pushdown(int u) {
            if(t[u].lazy) {
                if(ls) ls=copy_node(ls);
                if(rs) rs=copy_node(rs);
                if(ls) t[ls].lazy^=1;
                if(rs) t[rs].lazy^=1;
                swap(ls,rs);
                t[u].lazy^=1;
            }
        }
        int merge(int x,int y) {
            if(!x||!y) return x+y;
            pushdown(x),pushdown(y);
            if(t[x].pri<t[y].pri) {
                t[x].ch[1]=merge(t[x].ch[1],y);
                pushup(x);return x;
            } else {
                t[y].ch[0]=merge(x,t[y].ch[0]);
                pushup(y);return y;
            }   
        }
        void split(int u,int k,int &x,int &y) {
            if(!u) x=y=0;
            else {
                pushdown(u);
                u=copy_node(u);
                if(t[ls].siz+1<=k)
                    x=u,split(rs,k-t[ls].siz-1,t[x].ch[1],y);
                else
                    y=u,split(ls,k,x,t[y].ch[0]);
                pushup(u);
            }
        }
    }
    using namespace fhq_treap;
    int rt[_];
    int main() {
        srand(19260817); 
        int T=read();
        ll lastans=0;
        for(int i=1;i<=T;++i) {
            int super_cool=read(),opt=read(),x,y,z;
            if(opt==1) {
                ll p=read()^lastans,v=read()^lastans;
                split(rt[super_cool],p,x,y);
                rt[i]=merge(merge(x,make_node(v)),y);
            } else if(opt==2) {
                ll p=read()^lastans;
                split(rt[super_cool],p,x,z);
                split(x,p-1,x,y);
                rt[i]=merge(x,z);
            } else if(opt==3) {
                ll l=read()^lastans,r=read()^lastans;
                split(rt[super_cool],r,x,z);
                split(x,l-1,x,y);
                t[y].lazy^=1;
                rt[i]=merge(merge(x,y),z);
            } else {
                ll l=read()^lastans,r=read()^lastans;
                split(rt[super_cool],r,x,z);
                split(x,l-1,x,y);
                printf("%lld
    ",lastans=t[y].sum);
                rt[i]=merge(merge(x,y),z);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    10大开源文档管理系统,知识管理系统
    okhttp原理,okhttp为什么好?
    开放式创新对程序开发有什么深远的影响?
    TypeScript中文手册【从入门到精通】
    CentoOS6 32停更了,如何继续用yum源【解决方案】
    electronic为什么要用JavaScript开发桌面应用
    统一身份认证登录入口,统一用户认证和单点登录解决方案
    PHP数组如何倒叙 array_reverse
    Windows electron开发实例大全
    AI深度学习的基础上处理自然语言
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/11228084.html
Copyright © 2011-2022 走看看