1503: [NOI2004]郁闷的出纳员

Time Limit: 5 Sec  Memory Limit: 64 MB

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

题解:

当时想拿这道题学splay的结果把自己调死了……今天又回来看这道题感觉很清晰……

我们考虑对于一个节点,在它插入以前,工资调整它不会受到影响,插入以后才被影响

但是我们又不能实时的更新每个节点的值,所以我们考虑用一个变量来差分:

用tmp变量记录到目前为止的工资变动,如果我们要插入一个本来值为val的节点,我们就插入一个值val-tmp

而查询的时候,节点的实际值是val+tmp'。tmp'-tmp就是它从插入开始到现在的变化工资,所以这样我们就可以正确的计算了。

剩下的实现就很简单了,代码见下:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <ctime>
  4. #include <iostream>
  5. #include <cstdlib>
  6. using namespace std;
  7. int minn,ans;
  8. struct Treap
  9. {
  10. Treap *ch[];
  11. int size,val,key;
  12. Treap(){val=size=;key=rand();ch[]=ch[]=NULL;}
  13. inline void update()
  14. {size=ch[]->size+ch[]->size+;}
  15. }*null=new Treap,*root=null;
  16. typedef pair<Treap*,Treap*> D;
  17. inline Treap* newTreap(int v)
  18. {
  19. Treap *o=new Treap();
  20. o->ch[]=o->ch[]=null;
  21. o->size=;o->val=v;
  22. return o;
  23. }
  24. Treap* merge(Treap* a,Treap* b)
  25. {
  26. if(a==null)return b;
  27. if(b==null)return a;
  28. if(a->key < b->key)
  29. {a->ch[]=merge(a->ch[],b);a->update();return a;}
  30. else
  31. {b->ch[]=merge(a,b->ch[]);b->update();return b;}
  32. }
  33. D split(Treap *o,int k)
  34. {
  35. if(o==null)return D(null,null);
  36. D y;
  37. if(o->ch[]->size >= k)
  38. {y=split(o->ch[],k);o->ch[]=y.second;o->update();y.second=o;}
  39. else
  40. {y=split(o->ch[],k-o->ch[]->size-);o->ch[]=y.first;o->update();y.first=o;}
  41. return y;
  42. }
  43. int getrank(Treap *o,int val)
  44. {
  45. if(o==null)return ;
  46. return o->val >= val?getrank(o->ch[],val):getrank(o->ch[],val)+o->ch[]->size+;
  47. }
  48. inline int getval(int rank)
  49. {
  50. D x=split(root,rank-);
  51. D y=split(x.second,);
  52. int ans=y.first->val;
  53. root=merge(merge(x.first,y.first),y.second);
  54. return ans;
  55. }
  56. inline void insert(int val)
  57. {
  58. int k=getrank(root,val);
  59. D x=split(root,k);
  60. Treap *o=newTreap(val);
  61. root=merge(merge(x.first,o),x.second);
  62. }
  63. inline void erase()
  64. {
  65. D x=split(root,);
  66. root=x.second;ans++;
  67. }
  68. int main()
  69. {
  70. int m,x,tmp=;char s[];
  71. scanf("%d%d",&m,&minn);
  72. while(m--)
  73. {
  74. scanf("%s%d",s,&x);
  75. switch(s[])
  76. {
  77. case 'I':if(x>=minn)insert(x-tmp);break;
  78. case 'F':
  79. {
  80. if(root==null||root->size<x)printf("-1\n");
  81. else printf("%d\n",getval(root->size-x+)+tmp);
  82. break;
  83. }
  84. case 'A':tmp+=x;break;
  85. case 'S':
  86. {tmp-=x;while(root!=null&&getval()+tmp<minn)erase();break;}
  87. }
  88. }
  89. printf("%d",ans);
  90. }

[BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap的更多相关文章

  1. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

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

  2. [BZOJ1503][NOI2004]郁闷的出纳员

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

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

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

  4. bzoj1503: [NOI2004]郁闷的出纳员(伸展树)

    1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...

  5. 2018.08.06 bzoj1503: [NOI2004]郁闷的出纳员(非旋treap)

    传送门 平衡树简单题. 直接用fhgtreap实现分裂和合并就没了. 代码: #include<bits/stdc++.h> #define N 100005 using namespac ...

  6. [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)

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

  7. BZOJ1503[NOI2004]郁闷的出纳员——treap

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

  8. BZOJ1503: [NOI2004]郁闷的出纳员(Splay)

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

  9. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

随机推荐

  1. 【LG3242】 [HNOI2015]接水果

    题面 洛谷 题解 20pts 对于\(n,P,Q\leq 3000\),暴力判断每条路径的包含关系然后排序\(kth\)即可,复杂度\(O(PQ\log P)\) 另30pts 原树为一条链. 发现对 ...

  2. Zabbix学习之路(七)之Nginx的状态监控

    1.安装nginx [root@linux-node2 ~]# yum install -y nginx [root@linux-node2 ~]# mkdir /etc/zabbix/zabbix_ ...

  3. .net core 使用windows版redis

    在项目中为了减少程序占用内存(将结果保存在全局变量里面,会占用内存),要求使用redis.开始了爬坑的过程.o(╥﹏╥)o c#操作redis 基本就这3中情况: ServiceStack.Redis ...

  4. Spring Boot:Caused by: org.apache.ibatis.binding.BindingException: Parameter 'deptId' not found.

    1. 错误信息描述 在使用Spring Boot + Mybaits从前台向后台提交数据时,控制台报出该错误信息 2. 报错原因 在dao接口中,该方法拥有两个参数,Mybaits无法区分这两个参数 ...

  5. scala : 类型与类

    scala类型系统:1) 类型与类 在Java里,一直到jdk1.5之前,我们说一个对象的类型(type),都与它的class是一一映射的,通过获取它们的class对象,比如 String.class ...

  6. 车牌,车架号,VIN码毫秒识别技术,汽车后市场的春天到来了

    vin码(车架号)识别运用 不仅在制造.销售.保养.保险.车辆评估.交易环节会需要录入汽车的VIN码,在交通事故处理中,作为汽车身份唯一识别码,VIN码是处理事故的执法人员必须要记录的信息之一.随着汽 ...

  7. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  8. OpenLDAP配置TLS加密传输

    原文发表于cu:2016-07-04 参考文档: 基于OpenSSL自建CA与颁发SSL证书:http://seanlook.com/2015/01/18/openssl-self-sign-ca/ ...

  9. 基于preteus的1602液晶显示器的学习(LM016L)

    (证明学过,以示纪念) 所谓1602就是每行可以显示16个字符,可以显示两行.1602液晶在工业中使用比较广泛,其基本都采用的是HD44780控制器,或者兼容该指令集,因此基于HD44780写的控制程 ...

  10. 关于《数据结构》课本KMP算法的理解

    数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...