zoukankan      html  css  js  c++  java
  • hdu 4441 Queue Sequence(splay)

    题目链接:hdu 4441 Queue Sequence

    这题看了题解写的,题解传送门

      1 #include<bits/stdc++.h>
      2 #define F(i,a,b) for(int i=a;i<=b;++i)
      3 #define ls l,m,rt<<1
      4 #define rs m+1,r,rt<<1|1
      5 using namespace std;
      6 typedef long long ll;
      7 
      8 const int N=1e6+7;
      9 int _t;
     10 int pos[N][2];
     11 int tr[N<<2],q,cas;
     12 
     13 struct Splay_tree
     14 {
     15     int root;
     16     int key[N],cnt[N][2],sz[N],f[N],ch[N][2];
     17     ll sum[N];
     18     inline void nw(int &x,int val,int fa)
     19     {
     20         x=++_t,key[x]=val,f[x]=fa,sz[x]=1;
     21         sum[x]=val;
     22         cnt[x][0]=val>0;
     23         cnt[x][1]=val<0;
     24         ch[x][0]=ch[x][1]=0;
     25     }
     26     inline void up(int x){
     27         if(!x)return;
     28         int l=ch[x][0],r=ch[x][1];
     29         sz[x]=sz[l]+sz[r]+1;
     30         cnt[x][0]=cnt[l][0]+cnt[r][0]+(key[x]>0);
     31         cnt[x][1]=cnt[l][1]+cnt[r][1]+(key[x]<0);
     32         sum[x]=sum[l]+sum[r]+key[x];
     33     }
     34     void init()
     35     {
     36         root=0,_t=0;
     37         key[0]=0,cnt[0][1]=cnt[0][0]=0,f[0]=0,sz[0]=0,sum[0]=0;
     38         nw(root,0,0);
     39         nw(ch[root][1],q+1,root);
     40         up(ch[root][1]);
     41         up(root);
     42     }
     43     void rotate(int x){
     44         int y=f[x],w=ch[y][1]==x;
     45         ch[y][w]=ch[x][w^1];
     46         if(ch[x][w^1])f[ch[x][w^1]]=y;
     47         if(f[y]){
     48             int z=f[y];
     49             if(ch[z][0]==y)ch[z][0]=x;
     50             if(ch[z][1]==y)ch[z][1]=x;
     51         }
     52         f[x]=f[y],ch[x][w^1]=y,f[y]=x,up(y);
     53     }
     54     void splay(int x,int w){
     55         int s=1,i=x,y;
     56         while(f[x]!=w){
     57             y=f[x];
     58             if(f[y]!=w){if((ch[f[y]][0]==y)^(ch[y][0]==x))rotate(x);else rotate(y);}
     59             rotate(x);
     60         }
     61         if(!w)root=x;
     62         up(x);
     63     }
     64     inline int kth(int k)//获得第k小
     65     {
     66         if(k>sz[root]||k<=0)return 0;
     67         int x=root,tmp;
     68         while(1)
     69         {
     70             tmp=sz[ch[x][0]]+1;
     71             if(k==tmp)break;
     72             if(k<tmp)x=ch[x][0];else k-=tmp,x=ch[x][1];
     73         }
     74         return x;
     75     }
     76     inline int find(int x,int n)
     77     {
     78         int l=ch[x][0],r=ch[x][1];
     79         if(cnt[l][1]==n&&key[x]<0){splay(x,0);return sz[ch[root][0]];}
     80         else if(cnt[l][1]>=n+1)return find(l,n);
     81         else return find(r,n-cnt[l][1]-(key[x]<0));
     82     }
     83     inline void Delete(int r){  
     84         splay(r,0);  
     85         int pos=sz[ch[r][0]];
     86         splay(kth(pos),0);
     87         splay(kth(pos+2),root);
     88         ch[ch[root][1]][0]=0;  
     89         up(ch[root][1]);  
     90         up(root);  
     91     } 
     92     int ins(int x,int p)
     93     {
     94         int ps=kth(p);
     95         splay(ps,0);
     96         splay(kth(p+1),root);
     97         nw(ch[ch[root][1]][0],x,ch[root][1]);
     98         up(ch[root][1]),up(root);
     99         return ch[ch[root][1]][0];
    100     }
    101 }spt;
    102 //--------------------------------
    103 void build(int l=1,int r=q,int rt=1)
    104 {
    105     if(l==r){tr[rt]=l;return;}
    106     int m=l+r>>1;
    107     build(ls),build(rs);
    108     tr[rt]=min(tr[rt<<1],tr[rt<<1|1]);
    109 }
    110 
    111 void update(int x,int v,int l=1,int r=q,int rt=1)//1为插入
    112 {
    113     if(l==r)
    114     {
    115         if(v)tr[rt]=INT_MAX;else tr[rt]=l;
    116         return;
    117     }
    118     int m=l+r>>1;
    119     if(x<=m)update(x,v,ls);else update(x,v,rs);
    120     tr[rt]=min(tr[rt<<1],tr[rt<<1|1]);
    121 }
    122 
    123 void insert(int x)
    124 {
    125     int now=tr[1];
    126     update(now,1);
    127     pos[now][0]=spt.ins(now,x+1);
    128     spt.splay(pos[now][0],0);
    129     int n=spt.cnt[spt.ch[spt.root][0]][0],m;
    130     if(spt.cnt[spt.root][1]<=n)m=spt.sz[spt.root]-1;
    131     else m=spt.find(spt.root,n);
    132     pos[now][1]=spt.ins(-now,m);
    133 }
    134 
    135 void query(int x)
    136 {
    137     spt.splay(pos[x][0],0);
    138     spt.splay(pos[x][1],spt.root);
    139     printf("%lld
    ",spt.sum[spt.ch[spt.ch[spt.root][1]][0]]);
    140 }
    141 
    142 void remove(int x)
    143 {
    144     spt.Delete(pos[x][0]);
    145     spt.Delete(pos[x][1]);
    146     update(x,0);
    147 }
    148 
    149 int main()
    150 {
    151     while(~scanf("%d",&q))
    152     {
    153         char cmd[10];
    154         int x;
    155         printf("Case #%d:
    ",++cas);
    156         spt.init(),build();
    157         F(i,1,q)
    158         {
    159             scanf("%s%d",cmd,&x);
    160             if(cmd[0]=='i')insert(x);
    161             else if(cmd[0]=='q')query(x);
    162             else remove(x);
    163         }
    164     }
    165     return 0;
    166 }
    View Code
  • 相关阅读:
    【测试技术】ant在测试中的使用@文件以及目录的读写删和复制
    【测试环境】java|jdk|ant
    【测试理论】入行7年,一点感悟
    home_work picture
    linux shell awk 语法
    linux shell 指令 诸如-d, -f, -e之类的判断表达式
    软件测试工作这两年来,我丢失了什么?(一)
    软件测试工作近两年来的感想和未来规划(一)
    用Python进行SQLite数据库操作
    python selenium xpath定位时使用变量
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6359071.html
Copyright © 2011-2022 走看看