• 无旋treap


    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define P pair<int,int>
    #define ls(x) T[x].ls
    #define rs(x) T[x].rs
    using namespace std;
    struct Treenode
    {
        int val,ls,rs,size;
        int rnd;
    }T[100010];
    int cnt,n,rt;
    int ran()
    {
        static int seed=20172101;
        seed+=(seed<<2)+1;
        return seed;
    }
    void update(int a)
    {
        T[a].size=T[ls(a)].size+T[rs(a)].size+1;
    }
    int merge(int a,int b) //maxa<minnb
    {
        if(a==0)return b;
        if(b==0)return a;
        if(T[a].rnd<T[b].rnd) {T[a].rs=merge(T[a].rs,b);update(a);return a;}
        else {T[b].ls=merge(a,T[b].ls);update(b);return b;}
    }
    P split(int a,int n)
    {
        if(n==0) return make_pair(0,a);
        int L=ls(a),R=rs(a);
        if(n==T[L].size) {T[a].ls=0;update(a);return make_pair(L,a);}
        if(n==T[L].size+1) {T[a].rs=0;update(a);return make_pair(a,R);}
        if(n<T[L].size)
        {
            P tmp=split(L,n);
            T[a].ls=tmp.second;update(a);return make_pair(tmp.first,a);
        }
        P tmp=split(R,n-T[L].size-1);
        T[a].rs=tmp.first;update(a);return make_pair(a,tmp.second);
    }
    int rank(int x,int rt)
    {
        int ans=0,tp=2147483233;
        while(rt)
        {
            if(T[rt].val==x) tp=min(tp,ans+T[ls(rt)].size+1);
            if(T[rt].val<x) {ans+=T[ls(rt)].size+1;rt=rs(rt);}
            else rt=ls(rt);
        }
        return tp==2147483233?ans:tp;
    }
    int find(int x,int rt)
    {
        while(1)
        {
           if(T[ls(rt)].size==x-1) return T[rt].val;
           if(T[ls(rt)].size>x-1) rt=ls(rt);
           else {x=x-T[ls(rt)].size-1;rt=rs(rt);}
        }
    }
    int pre(int x,int k)
    {
        int ans=-(int)1e9;
        while(k)
        {
            if(T[k].val<x) {ans=max(ans,T[k].val);k=rs(k);}
            else k=ls(k);
        }
        return ans;
    }
    int suf(int x,int k)
    {
        int ans=(int)1e9;
        while(k)
        {
            if(T[k].val>x) {ans=min(ans,T[k].val);k=ls(k);}
            else k=rs(k);    
        }    
        return ans;
    }
    int add(int x)
    {
        int k=rank(x,rt);
        P tmp=split(rt,k);
        T[++cnt].val=x;
        T[cnt].rnd=ran();
        T[cnt].size=1;
        rt=merge(tmp.first,cnt);
        rt=merge(rt,tmp.second);
    }
    int del(int x)
    {
        int k=rank(x,rt);
        P t1=split(rt,k);
        P t2=split(t1.first,k-1);
        rt=merge(t2.first,t1.second);
    }
    int main()
    {
        scanf("%d",&n);
        rt=0;
        while(n--)
        {
            int opt,x;
            scanf("%d%d",&opt,&x);
            if(opt==1)
                add(x);
            if(opt==2)
                del(x);
            if(opt==3)
                printf("%d
    ",rank(x,rt));
            if(opt==4)
                printf("%d
    ",find(x,rt));
            if(opt==5)
                printf("%d
    ",pre(x,rt));
            if(opt==6)
                printf("%d
    ",suf(x,rt));
        }
    }
    无旋treap(luogu3369)
  • 相关阅读:
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
    Jenkins 不同角色不同视图及不同权限设置
    dig挖出DNS的秘密
    Linux Shell高级技巧
    《Linux内核设计与实现》读书笔记
    github开发
    NodeJs-- 新建项目实例
    Linux makefile 教程 非常详细,且易懂
    cms完整视频教程+源码 孔浩老师 全131讲
    Redis实现简单消息队列
  • 原文地址:https://www.cnblogs.com/wjxgy/p/7921312.html
Copyright © 2020-2023  润新知