zoukankan      html  css  js  c++  java
  • bzoj3224

    题解:

    平衡树模板,打了大半个晚上,调了大半个晚上

    都是平衡树的基本操作

    代码:

    #include<bits/stdc++.h>
    const int N=800005;
    int root,tot,n,p,q,pre[N],c[N][2],size[N],data[N];
    void rot(int x)
    {
        int y=pre[x],k=(c[y][0]==x);
        size[y]=size[c[y][k]]+size[c[x][k]]+1;
        size[x]=size[c[x][!k]]+size[y]+1;
        c[y][!k]=c[x][k];
        pre[c[y][!k]]=y;
        pre[x]=pre[y];
        if(pre[y])c[pre[y]][c[pre[y]][1]==y]=x;
        c[x][k]=y;pre[y]=x;
    }
    void splay(int x,int g)
    {
        for(int y=pre[x];y!=g;rot(x),y=pre[x])
         if(pre[y]!=g)rot((x==c[y][0])==(y==c[pre[y]][0])?y:x);
        if(g==0)root=x;
    }
    void insert(int x)
    {
        int y=root;
        while(c[y][x>data[y]]) y=c[y][x>data[y]];
        data[++tot]=x;
        c[tot][0]=c[tot][1]=0;
        pre[tot]=y;
        if(y)c[y][x>data[y]]=tot;
        splay(tot,0);
    }
    void del(int x)
    {
        int y=root;
        while(data[y]!=x) y=c[y][x>data[y]];
        splay(y,0);
        y=c[root][1];
        bool b;
        if(!y) b=1,y=c[root][0];else b=0;
        while(c[y][b]) y=c[y][b];
        splay(y,root);
        c[y][b]=c[root][b];pre[c[root][b]]=y;pre[y]=0;root=y;
        size[y]=size[c[y][!b]]+size[c[y][b]];
    }
    int find(int x)
    {
        int y=root,ans=0;
        while(y)
         if(x>data[y])ans+=size[c[y][0]]+1,y=c[y][1];
         else y=c[y][0];
        return ans+1;
    }
    int findkth(int x)
    {
        int y=root;
        while(x)
        if(size[c[y][0]]+1<x)x-=size[c[y][0]]+1,y=c[y][1];
        else if(size[c[y][0]]+1==x) return data[y];
        else y=c[y][0];
        return data[y];
    }
    int findpre(int x)
    {
        int ans;
        for(int y=root;y;)
         if(data[y]<x)ans=data[y],y=c[y][1];
         else y=c[y][0];
        return ans;
    }
    int findnxt(int x)
    {
        int ans;
        for(int y=root;y;)
         if(data[y]<=x)y=c[y][1];
         else ans=data[y],y=c[y][0];
        return ans;
    }
    int main()
    {
        scanf("%d",&n);
        while (n--)
         {
            scanf("%d%d",&p,&q);
            if(p==1) insert(q);
            if(p==2) del(q);
            if(p==3) printf("%d
    ",find(q));
            if(p==4) printf("%d
    ",findkth(q));
            if(p==5) printf("%d
    ",findpre(q));
            if(p==6) printf("%d
    ",findnxt(q));
         }
    }
  • 相关阅读:
    bzoj 3594: [Scoi2014]方伯伯的玉米田
    普通平衡树(指针splay)
    codeforces 475D. CGCDSSQ
    php 购物车功能
    PHP现阶段发现的不足点
    php 多维数据根据某个或多个字段排序
    redis可视化辅助工具
    Redis在window下安装以及配置
    hive数据操作
    hive 表分区操作
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7867806.html
Copyright © 2011-2022 走看看