非旋式Treap

SuperMemo

struct Treap
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=2e5+5;
    static int rd()
    {
        static int seed=2333;
        return seed=seed*482711ll%2147483647;
    }

    struct node
    {
        ll val,minn,ad;
        int nex[3],siz,key;
        bool rev;

        void set(ll v)
        {
            val=minn=v;
        }

        void operator+=(const node &b)
        {
            siz+=b.siz;
            minn=min(minn,b.minn);
        }

        void putrev(){rev=!rev;}

        void putadd(ll v)
        {
            val+=v,minn+=v,ad+=v;
        }

        void clear()
        {
            key=rd();
            rev=false;
            siz=1,ad=0;
            mem(nex,0);
        }
    }t[__];

    int root;

    void pushup(int x)
    {
        t[x].siz=1,t[x].minn=t[x].val;
        if(ls(x))t[x]+=t[ls(x)];
        if(rs(x))t[x]+=t[rs(x)];
    }

    void pushdown(int x)
    {
        if(t[x].rev)
        {
            swap(ls(x),rs(x));
            if(ls(x))t[ls(x)].putrev();
            if(rs(x))t[rs(x)].putrev();
            t[x].rev=0;
        }
        if(t[x].ad)
        {
            if(ls(x))t[ls(x)].putadd(t[x].ad);
            if(rs(x))t[rs(x)].putadd(t[x].ad);
            t[x].ad=0;
        }
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    Treap() {clear();}

    void up(int x)
    {
        for(;x;x=fa(x))pushup(x);
    }

    pii split(int x,int p)
    {
        int rt[3]={0},now[3]={0};
        for(int siz1=0;x;)
        {
            pushdown(x);
            int k=(t[ls(x)].siz+1+siz1<=p)?1:2;
            if(!rt[k])rt[k]=x;
            else fa(t[now[k]].nex[3-k]=x)=now[k];
            if(k==1)siz1+=t[ls(x)].siz+1;
            now[k]=x,x=t[x].nex[3-k];
        }
        rs(now[1])=0,up(now[1]);
        ls(now[2])=0,up(now[2]);
        return mp(rt[1],rt[2]);
    }

    int merge(int x,int y)
    {
        if(!x || !y)return x?x:y;
        int rt[3]={0,x,y},z=0,d=0;
        while(rt[1] && rt[2])
        {
            int k=(t[rt[1]].key<=t[rt[2]].key)?1:2;
            if(!rt[1] || !rt[2])k=(rt[1]?1:2);
            pushdown(rt[k]);
            if(!rt[0])rt[0]=rt[k];
            else fa(t[z].nex[d]=rt[k])=z;
            z=rt[k],rt[k]=t[rt[k]].nex[d=3-k];
        }
        fa(t[z].nex[d]=rt[1]?rt[1]:rt[2])=z;
        up(z);
        return rt[0];
    }

    //a[p]后插入一个数p
    void insert(int p,ll v)
    {
        pii y=split(root,p);
        int x=M.get();
        t[x].clear();
        t[x].set(v);
        root=merge(merge(y.fi,x),y.se);
    }

    //删除a[p]
    void erase(int p)
    {
        pii x=split(root,p-1);
        pii y=split(x.se,1);
        root=merge(x.fi,y.se);
    }

    //a[l]……a[r] +val
    void add(int l,int r,ll v)
    {
        pii x=split(root,r);
        pii y=split(x.fi,l-1);
        t[y.se].putadd(v);
        root=merge(merge(y.fi,y.se),x.se);
    }

    //a[l]……a[r] -> a[r]……a[l]
    void reversal(int l,int r)
    {
        pii x=split(root,r);
        pii y=split(x.fi,l-1);
        t[y.se].putrev();
        root=merge(merge(y.fi,y.se),x.se);
    }

    //min(a[l]……a[r])
    ll get_min(int l,int r)
    {
        pii x=split(root,r);
        pii y=split(x.fi,l-1);
        ll v=t[y.se].minn;
        root=merge(merge(y.fi,y.se),x.se);
        return v;
    }

    //a[l]……a[r] -> a[r-k+1]……a[r]a[l]……a[r-k]
    void revolve(int l,int r,int k)
    {
        k=(k%(r-l+1)+(r-l+1))%(r-l+1);
        if(!k)return;
        pii x=split(root,r);
        pii y=split(x.fi,l-1);
        pii z=split(y.se,r-l+1-k);
        root=merge(merge(y.fi,merge(z.se,z.fi)),x.se);
    }

    void clear()
    {
        root=0;
        M.clear();
    }
}T;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容