zoukankan      html  css  js  c++  java
  • bzoj 1503: [NOI2004]郁闷的出纳员

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<ctime>
      4 struct shu
      5 {
      6     int l,r,sum,zhi,dui;
      7 }a[100005];
      8 int n,xia,root,size,lei,leave;
      9 char ch[2];
     10 void you(int &a1)
     11 {
     12     int t=a[a1].l;
     13     a[a1].l=a[t].r;
     14     a[t].r=a1;
     15     a[t].sum=a[a1].sum;
     16     a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
     17     a1=t;
     18     return;
     19 }
     20 void zuo(int &a1)
     21 {
     22     int t=a[a1].r;
     23     a[a1].r=a[t].l;
     24     a[t].l=a1;
     25     a[t].sum=a[a1].sum;
     26     a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
     27     a1=t;
     28     return;
     29 }
     30 void jia(int &a1,int a2)
     31 {
     32     if(a1==0)
     33       {
     34         size++;
     35         a1=size;
     36         a[a1].sum=1;
     37         a[a1].zhi=a2;
     38         a[a1].dui=rand();
     39         return;
     40       }
     41     a[a1].sum++;
     42     if(a2<a[a1].zhi)
     43       {
     44         jia(a[a1].l,a2);
     45         if(a[a[a1].l].dui<a[a1].dui)
     46           you(a1);
     47       }
     48     else
     49       {
     50         jia(a[a1].r,a2);
     51         if(a[a[a1].r].dui<a[a1].dui)
     52           zuo(a1);
     53       }
     54     return;
     55 }
     56 int shan(int &a1,int a2)
     57 {
     58     if(a1==0)
     59       return 0;
     60     int t;
     61     if(a[a1].zhi<a2)
     62       {
     63         t=a[a[a1].l].sum+1;
     64         a1=a[a1].r;
     65         return t+shan(a1,a2);
     66       }
     67     t=shan(a[a1].l,a2);
     68     a[a1].sum-=t;
     69     return t;
     70 }
     71 int zhao(int a1,int a2)
     72 {
     73     if(a[a[a1].r].sum+1==a2)
     74       return a[a1].zhi;
     75     if(a[a[a1].r].sum>=a2)
     76       return zhao(a[a1].r,a2);
     77     else
     78       return zhao(a[a1].l,a2-a[a[a1].r].sum-1);
     79 }
     80 int main()
     81 {
     82     root=size=0;
     83     scanf("%d%d",&n,&xia);
     84     for(int i=0;i<n;i++)
     85       {
     86         int a1;
     87         scanf("%s%d",ch,&a1);
     88         if(ch[0]=='I')
     89           if(a1>=xia)
     90             jia(root,a1-lei);
     91         if(ch[0]=='A')
     92           lei+=a1;
     93         if(ch[0]=='S')
     94           {
     95             lei-=a1;
     96             leave+=shan(root,xia-lei);
     97             }
     98         if(ch[0]=='F')
     99           {
    100             if(a1>a[root].sum)
    101               printf("-1
    ");
    102             else
    103               printf("%d
    ",zhao(root,a1)+lei);
    104           }
    105       }
    106     printf("%d
    ",leave);
    107     return 0;
    108 }

    平衡树 treap

  • 相关阅读:
    C# 中==和Equal的区别
    3dmath复习随笔
    3dmax学习资料记录
    [官方教程] Unity 5 BLACKSMITH深度分享
    [技术] [插件精选] 炫酷粒子特效(下)
    Unity3D总结:关于射线碰撞
    Unity3D将来时:IL2CPP(上)
    3DMAX 9 角色建模3 uv展开
    php,c# hamsha1
    U3D 的一些基础优化
  • 原文地址:https://www.cnblogs.com/xydddd/p/5271181.html
Copyright © 2011-2022 走看看