1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. #define rep(i,j,k) for(int i=j;i<=k;i++)
  6. #define per(i,j,k) for(int i=j;i>=k;i--)
  7. using namespace std;
  8. const int maxx = 2e5+;
  9. int lson[maxx*],rson[maxx*],sum[maxx*];
  10. int tot=,root=;
  11. bool laze[maxx*];
  12. void push_down(int x){
  13. if(laze[x]){
  14. if(!lson[x])lson[x]=++tot;
  15. if(!rson[x])rson[x]=++tot;
  16. sum[lson[x]]=;
  17. sum[rson[x]]=;
  18. laze[lson[x]]=;
  19. laze[rson[x]]=;
  20. laze[x]=;
  21. }
  22. }
  23. void inserts(int l,int r,int x,int &p){
  24. if(!p)p=++tot;
  25. if (l==r){
  26. sum[p]++;
  27. return;
  28. }
  29. int mid=(l+r)>>;
  30. push_down(p);
  31. if (x<=mid){
  32. inserts(l,mid,x,lson[p]);
  33. }else {
  34. inserts(mid+,r,x,rson[p]);
  35. }
  36. sum[p]=sum[lson[p]]+sum[rson[p]];
  37. }
  38. void update(int l,int r,int ul,int ur,int &p){
  39. if (!p)p=++tot;
  40. if (ul<=l && r<=ur){
  41. sum[p]=;
  42. laze[p]=;
  43. return;
  44. }
  45. push_down(p);
  46. int mid=(l+r)>>;
  47. if(ul<=mid)update(l,mid,ul,ur,lson[p]);
  48. if(ur>mid)update(mid+,r,ul,ur,rson[p]);
  49. sum[p]=sum[lson[p]]+sum[rson[p]];
  50. }
  51. int kth(int l,int r,int k,int &p){
  52. if(l==r){
  53. return l;
  54. }
  55. int mid=(l+r)>>;
  56. push_down(p);
  57. if(k<=sum[lson[p]]){
  58. return kth(l,mid,k,lson[p]);
  59. }else {
  60. return kth(mid+,r,k-sum[lson[p]],rson[p]);
  61. }
  62. }
  63. int main(){
  64. int n,m,w;
  65. int add=,nowmin,num=;
  66. char op[];
  67. while(~scanf("%d%d",&n,&nowmin)){
  68. rep(i,,n){
  69. scanf("%s%d",op,&w);
  70. if (op[]=='I'){
  71. //减去影响后如果起薪小于工资下界
  72. if (w-add<nowmin)continue;
  73. //他的工资实际上应该是他的起
  74. inserts(-maxx,maxx,w-add,root);
  75. num++;
  76. }else if(op[]=='A'){
  77. //偏移应该加上
  78. add+=w;
  79. //同时此时要求最低的工资降低
  80. nowmin-=w;
  81. }else if(op[]=='S'){
  82. add-=w;
  83. nowmin+=w;
  84. //比最低工资低的值全部赋值为0
  85. update(-maxx,maxx,-maxx,nowmin-,root);
  86. }else {
  87. //如果所有人被开除
  88. if(w>sum[]){
  89. printf("-1\n");
  90. continue;
  91. }else {
  92. //查询剩下的第K大,并且要加上偏移
  93. //其实等价于查询当前第K大=总数-第K小+1
  94. printf("%d\n",kth(-maxx,maxx,sum[]-w+,root)+add);
  95. }
  96. }
  97. }
  98. printf("%d\n",num-sum[]);
  99. }
  100. return ;
  101. }

权值线段树+动态开点[NOI2004]郁闷的出纳员的更多相关文章

  1. cogs 1829. [Tyvj 1728]普通平衡树 权值线段树

    1829. [Tyvj 1728]普通平衡树 ★★★   输入文件:phs.in   输出文件:phs.out   简单对比时间限制:1 s   内存限制:1000 MB [题目描述] 您需要写一种数 ...

  2. luogu3224 永无乡(动态开点,权值线段树合并)

    luogu3224 永无乡(动态开点,权值线段树合并) 永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示.某些 ...

  3. P2617 Dynamic Rankings (动态开点权值线段树 + 树状数组)

    题意:带修求区间k小 题解:回忆在使用主席树求区间k小时 利用前缀和的思想 既然是前缀和 那么我们可以使用更擅长维护前缀和的树状数组 但是这里每一颗权值线段树就不是带版本的 而是维护数组里i号点的权值 ...

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  5. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  6. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

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

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

  8. P1486 [NOI2004]郁闷的出纳员[权值线段树]

    权值线段树. 我们只用维护一个人是否存在,以及他当前排名,而不关心工资的具体值,这个可以直接算. 不难发现,如果不考虑新的员工,所有员工的工资的差值是不变的. 而加进来一个新的员工时,其工资为\(x\ ...

  9. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

随机推荐

  1. Linux部署教育云平台测试环境总结

    2016年10月16日换了新公司,刚进公司就要进行平台测试环境部署,由于之前Linux用的比较少,只用过几个简单的杀进程.重启tomcat.查看日志等简单的操作命令,真要在LInux服务器上部署环境的 ...

  2. linux查看现在在运行的进程 $ pstree -a$ ps aux

    这都是查看现有进程的. ps aux 的结果比较杂乱 pstree -a 的结果比较简单明了,可以看到正在运行的进程及相关用户.

  3. 洛谷P1470 最长前缀

    P1470 最长前缀 Longest Prefix 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 ...

  4. ACdream 1007 (快速幂)

    题目链接 a + b Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Problem D ...

  5. poj 2406 Power Strings(KMP入门,next函数理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 37685   Accepted: 15590 D ...

  6. twisted(转)

    reactor.protocol 这两个类都在 twisted.internet 命名空间中 reactor对象是Twisted编程当中的第一步,它就是一个反应器,专门负责与服务端的连接以及监听与服务 ...

  7. C++学习笔记----4.4 继承情况下的类作用域嵌套

    引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员 ...

  8. 学习String类

    1. 描述: String类是java中比较常用的类, 表示字符串类型 当拼接大量数据时, String类性能没有StringBuilder和StringBuffer性能高 2. 常用的String语 ...

  9. 备考2019年6月份PMP考试-分享一些考试笔记(二)

    最新比较经典的100道试题,有备考的小伙伴可以练练手,文章末尾附答案. 1     一个项目经理在运作一个数据中心安装项目.他发现相关方很恼火,因为他超出了预算,原因是人员费用要高于原先的计划.另外项 ...

  10. LocalDateTime计算时间差

    LocalDateTime 为java8的新特性之一 LocalDateTime.now() 获得当前时间 java.time.Duration duration = java.time.Durati ...