1503: [NOI2004]郁闷的出纳员

http://www.lydsy.com/JudgeOnline/problem.php?id=1503

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 4094  Solved: 1496
[Submit][Status]

Description

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。 老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。 好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?

Input

Output

输出文件的行数为F命令的条数加一。 对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。 输出文件的最后一行包含一个整数,为离开公司的员工的总数。

Sample Input

9 10
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2

Sample Output

10
20
-1
2

HINT

I命令的条数不超过100000
A命令和S命令的总条数不超过100
F命令的条数不超过100000
每次工资调整的调整量不超过1000
新员工的工资不超过100000

Source

 

[Submit][Status]

HOME Back


解析:

这是一道数据结构题,据说splay,AVL,SBT,Treap,线段树 ,树状数组等都可以实现

这两天刚学了SBT,虽然部分代码理解的还不是很透彻,但大致思想还是掌握了。。。

这里推荐两个学习SBT的地址:

讲解:http://www.nocow.cn/index.php/Size_Balanced_Tree

代码(包括SBT的九种操作):http://www.docin.com/p-481614045.html

  这个链接也挺不错的:http://www.cnblogs.com/zhsl/p/3189901.html

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4.  
  5. using namespace std;
  6.  
  7. const int N=;
  8.  
  9. struct SBT{
  10. int l,r,sz,key;
  11. void init(){
  12. l=r=key=;
  13. sz=;
  14. }
  15. }tree[N];
  16.  
  17. int root,tot;
  18.  
  19. void go_left(int &rt){
  20. int k=tree[rt].r;
  21. tree[rt].r=tree[k].l;
  22. tree[k].l=rt;
  23. tree[k].sz=tree[rt].sz;
  24. tree[rt].sz=tree[tree[rt].l].sz+tree[tree[rt].r].sz+;
  25. rt=k;
  26. }
  27.  
  28. void go_right(int &rt){
  29. int k=tree[rt].l;
  30. tree[rt].l=tree[k].r;
  31. tree[k].r=rt;
  32. tree[k].sz=tree[rt].sz;
  33. tree[rt].sz=tree[tree[rt].l].sz+tree[tree[rt].r].sz+;
  34. rt=k;
  35. }
  36.  
  37. void maintain(int &rt,int flag){
  38. if(flag){
  39. if(tree[tree[tree[rt].r].r].sz>tree[tree[rt].l].sz)
  40. go_left(rt);
  41. else if(tree[tree[tree[rt].r].l].sz>tree[tree[rt].l].sz){
  42. go_right(tree[rt].r);
  43. go_left(rt);
  44. }else
  45. return ;
  46. }else{ //否则更新左子树
  47. if(tree[tree[tree[rt].l].l].sz>tree[tree[rt].r].sz)
  48. go_right(rt);
  49. else if(tree[tree[tree[rt].l].r].sz>tree[tree[rt].r].sz){
  50. go_left(tree[rt].l);
  51. go_right(rt);
  52. }else
  53. return ;
  54. }
  55. maintain(tree[rt].l,false);
  56. maintain(tree[rt].r,true);
  57. maintain(rt,false);
  58. maintain(rt,true);
  59. }
  60.  
  61. void insert(int &rt,int k){
  62. if(rt==){
  63. rt=(++tot);
  64. tree[rt].init();
  65. tree[rt].key=k;
  66. }else{
  67. tree[rt].sz++;
  68. if(k<tree[rt].key)
  69. insert(tree[rt].l,k);
  70. else
  71. insert(tree[rt].r,k);
  72. maintain(rt,k>=tree[rt].key);
  73. }
  74. }
  75.  
  76. void Delete(int &rt,int delay,int min_val){
  77. if(!rt)
  78. return ;
  79. if(tree[rt].key+delay<min_val){
  80. rt=tree[rt].r;
  81. Delete(rt,delay,min_val);
  82. }else{
  83. Delete(tree[rt].l,delay,min_val);
  84. tree[rt].sz=tree[tree[rt].l].sz+tree[tree[rt].r].sz+;
  85. }
  86. }
  87.  
  88. int get_max_kth(int &rt,int k){
  89. int tmp=tree[tree[rt].r].sz+;
  90. if(tmp==k)
  91. return tree[rt].key;
  92. else if(tmp<k)
  93. return get_max_kth(tree[rt].l,k-tmp);
  94. return get_max_kth(tree[rt].r,k);
  95. }
  96.  
  97. int main(){
  98.  
  99. //freopen("input.txt","r",stdin);
  100.  
  101. int n,min_val,delay;
  102. while(~scanf("%d%d",&n,&min_val)){
  103. tot=delay=root=;
  104. char op[];
  105. int x;
  106. while(n--){
  107. scanf("%s%d",op,&x);
  108. if(op[]=='I'){
  109. if(x<min_val)
  110. continue;
  111. insert(root,x-delay);
  112. }else if(op[]=='A')
  113. delay+=x;
  114. else if(op[]=='F')
  115. printf("%d\n",tree[root].sz<x?-:get_max_kth(root,x)+delay);
  116. else{
  117. delay-=x;
  118. Delete(root,delay,min_val);
  119. }
  120. }
  121. printf("%d\n",tot-tree[root].sz);
  122. }
  123. return ;
  124. }

1503: [NOI2004]郁闷的出纳员 (SBT)的更多相关文章

  1. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Statu ...

  2. BZOJ 1503: [NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 10526  Solved: 3685[Submit][Stat ...

  3. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  4. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  5. (WA)BZOJ 1503: [NOI2004]郁闷的出纳员

    二次联通门 : BZOJ 1503: [NOI2004]郁闷的出纳员 /* BZOJ 1503: [NOI2004]郁闷的出纳员 考虑这样一个事实 无论是加或减 都是针对全体人员的 那么只需要记录一个 ...

  6. 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...

  7. 1503. [NOI2004]郁闷的出纳员【平衡树-splay】

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...

  8. 1503: [NOI2004]郁闷的出纳员

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13723  Solved: 4989[Submit][Status][Discuss] Descripti ...

  9. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

随机推荐

  1. [Spring boot] Autowired by name, by @Primary or by @Qualifier

    In the example we have currently: @Component public class BinarySearchImpl { @Autowired private Sort ...

  2. [Git] Undo my last commit and split it into two separate ones

    When you accidentally committed some changes to your branch you have various possibilities to “undo” ...

  3. ASP.NET MVC提交LIST列表到后台接收不到数据

    兄跌 你看到这篇文章的时候已经找到答案了. 我在解决这个问题的端倪的时候已经浪费了我一个下午的休假时间.所以你应该给我一个赞!!! 不废话了上代码: Entity(Model) [Serializab ...

  4. C++ 纯虚方法

    1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义,比如Animal的Eat()方法,调用Animal的Eat方法是没有意义的 ...

  5. oracle v$sqlarea 分析SQL语句使用资源情况 确认是否绑定变量

    -如何确定系统中是否存在绑定变量的情况:首先创建一个表,用于存放整理过得数据:create table t1 as select sql_text from v$sqlarea;----V$SQLAR ...

  6. yii源码三 -- db

    <AR> CActiveRecord:path:/framework/db/ar/CActiveRecord.phpoverview:is the base class for class ...

  7. 今天发现一个神奇的网站Greasy Fork

    Greasy Fork这个网站的神奇之处在于,提供了各路大神编写的脚本,可以在浏览器中实现各种神奇的功能,比如这个: 我下载使用了,确实好用,什么腾讯视频vip,爱奇艺视频vip,统统可以观看~ 并且 ...

  8. bash和shell的关系

    bash是borne again shell的缩写,它是shell的一种,Linux上默认采用的是bash. shell脚本中的方法带不带function的区别,例如: function foo () ...

  9. 在linux下makefile的使用

    在linux下makefile的使用

  10. npm 主要命令

    本文主要参考自:http://www.runoob.com/nodejs/nodejs-npm.html 1.使用 npm 命令安装模块 $ npm install express var expre ...