• 无旋Treap模板


    传送门


    ## Code 
    #include<bits/stdc++.h>
    #define ll long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    class fhq
    {
        #define MN 100005
        private:
            int sz;
            int val[MN],pri[MN],ls[MN],rs[MN],siz[MN],cnt;
            inline unsigned int random()
            {
                static unsigned int x=23333;
                return x^=x<<13,x^=x>>17,x^=x<<5;
            }
            inline void combine(int x){siz[x]=1+siz[ls[x]]+siz[rs[x]];}
        public:
            int rt;
            int Merge(int rt1,int rt2)
            {
                if(!rt1||!rt2) return rt2+rt1;
                if(pri[rt1]<pri[rt2])
                {
            		rs[rt1]=Merge(rs[rt1],rt2);
            		combine(rt1);return rt1;
        		}
        		else
                {
            		ls[rt2]=Merge(rt1,ls[rt2]);
            		combine(rt2);return rt2;
        		}
            }
            void Split(int x,int k,int&rt1,int&rt2)
            {
                if(!x) return (void)(rt1=rt2=0);
                if(k<=siz[ls[x]])
                {
                    Split(ls[x],k,rt1,rt2);
                    ls[x]=rt2;combine(x);rt2=x;
                }
                else
                {
                    Split(rs[x],k-siz[ls[x]]-1,rt1,rt2);
                    rs[x]=rt1;combine(x);rt1=x;
                }
            }
            int Rank(int x,int v)
            {
                if(!x) return 0;
                if(v<val[x]) return Rank(ls[x],v);
                else return siz[ls[x]]+Rank(rs[x],v)+1;
            }
            int Kth(int k)
            {
                register int rt1,rt2,rt3,c;
                Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,c);
                rt=Merge(rt3,Merge(c,rt2));
                return val[c];
            }
            void Insert(int v)
            {
                val[++sz]=v;pri[sz]=random(),siz[sz]=1;
                register int rk=Rank(rt,v),rt1,rt2;
                Split(rt,rk,rt1,rt2);
                rt=Merge(Merge(rt1,sz),rt2);
            }
            void Delete(int v)
            {
                register int rk=Rank(rt,v),rt1,rt2,rt3,c;
                Split(rt,rk,rt1,rt2);Split(rt1,rk-1,rt3,c);
                rt=Merge(rt3,rt2);
            }
    }T;
    int main(){
        register int m=read(),opt,x;
        while(m--)
        {
            opt=read(),x=read();
            switch(opt)
            {
            	case 1: T.Insert(x);break;
            	case 2: T.Delete(x);break;
            	case 3: printf("%d
    ",T.Rank(T.rt,x-1)+1);break;
            	case 4: printf("%d
    ",T.Kth(x));break;
            	case 5: printf("%d
    ",T.Kth(T.Rank(T.rt,x-1)));break;
            	case 6: printf("%d
    ",T.Kth(T.Rank(T.rt,x)+1));break;
            }
        }
        return 0;
    }
    

    传送门


    ## Code 
    #include<bits/stdc++.h>
    #define ll long long
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    class fhq
    {
        #define MN 100005
        private:
            int sz;
            int val[MN],pri[MN],ls[MN],rs[MN],siz[MN],rev[MN];
            inline unsigned int random()
            {
                static unsigned int x=23333;
                return x^=x<<13,x^=x>>17,x^=x<<5;
            }
            inline void up(int x){siz[x]=1+siz[ls[x]]+siz[rs[x]];}
            inline void down(int x){if(rev[x]) std::swap(ls[x],rs[x]),rev[ls[x]]^=1,rev[rs[x]]^=1,rev[x]=0;}
        public:
            int rt;
            int Merge(int rt1,int rt2)
            {
                if(!rt1||!rt2) return rt2+rt1;
                down(rt1),down(rt2);
                if(pri[rt1]<pri[rt2])
                {
            		rs[rt1]=Merge(rs[rt1],rt2);
            		up(rt1);return rt1;
        		}
        		else
                {
            		ls[rt2]=Merge(rt1,ls[rt2]);
            		up(rt2);return rt2;
        		}
            }
            void Split(int x,int k,int&rt1,int&rt2)
            {
                if(!x) return (void)(rt1=rt2=0);
                down(x);
                if(k<=siz[ls[x]])
                {
                    Split(ls[x],k,rt1,rt2);
                    ls[x]=rt2;up(x);rt2=x;
                }
                else
                {
                    Split(rs[x],k-siz[ls[x]]-1,rt1,rt2);
                    rs[x]=rt1;up(x);rt1=x;
                }
            }
            int Rank(int x,int v)
            {
                if(!x) return 0;
                if(v<val[x]) return Rank(ls[x],v);
                else return siz[ls[x]]+Rank(rs[x],v)+1;
            }
            void Insert(int v)
            {
                val[++sz]=v;pri[sz]=random(),siz[sz]=1;
                register int rk=Rank(rt,v),rt1,rt2;
                Split(rt,rk,rt1,rt2);
                rt=Merge(Merge(rt1,sz),rt2);
            }
            void Print(int x)
    		{
                if(!x) return;down(x);
                Print(ls[x]);printf("%d ",val[x]);Print(rs[x]);
            }
            void Reverse(int l,int r)
            {
            	register int rt1,rt2,rt3,rt4;
            	Split(rt,l-1,rt1,rt2);Split(rt2,r-l+1,rt3,rt4);
            	rev[rt3]^=1;rt=Merge(rt1,Merge(rt3,rt4));
    		}
    	#undef MN
    }T;
    int main(){
        register int n,m,i;
        n=read(),m=read();
        for(i=1;i<=n;++i) T.Insert(i);
        while(m--) i=read(),T.Reverse(i,read());
        T.Print(T.rt);puts("");
        return 0;
    }
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    理解和学习qml
    (离线)英语词典软件推荐
    Ubuntu:安装deb文件包以及deb卸载
    mac man汉化方法
    Linux中文件和目录的权限(r, w, x)
    解决mac休眠掉电的解决方法
    线程池之ThreadPool与ForkJoinPool
    程序员的知识焦虑
    回顾2018,展望2019
    NIO基础学习——缓冲区
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/10131940.html
Copyright © 2020-2023  润新知