权值分块,离散化非常蛋疼,只能离散化搞……

需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n))

码长和我的平衡树差不多……速度快3倍左右。

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. #define N 201001
  7. struct Point{int v,p;}tmp[N];
  8. bool operator < (const Point &a,const Point &b){return a.v<b.v;}
  9. int n,m,Infu,a[N],c[N],leave,
  10. en/*插入的权值数*/,en2/*离散化之后的权值种类数*/,ma[N];
  11. char op[N];
  12. int num[N],l[],CH[],r[],Num,sumv[],sum,sz,b[N],all;
  13. bool delta[N];
  14. inline void R(int &x){
  15. char c=;int f=;
  16. for(;c<''||c>'';c=getchar())if(c=='-')f=-;
  17. for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
  18. x*=f;
  19. }
  20. inline void P(int x)
  21. {
  22. if(!x){putchar('');puts("");return;}
  23. if(x<){putchar('-');x=-x;}Num=;
  24. while(x>)CH[++Num]=x%,x/=;
  25. while(Num)putchar(CH[Num--]+);puts("");
  26. }
  27. void makeblock()
  28. {
  29. sz=sqrt(en2); if(!sz) sz=;
  30. for(sum=;sum*sz<en2;sum++)
  31. {
  32. l[sum]=r[sum-]+;
  33. r[sum]=sum*sz;
  34. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  35. }
  36. l[sum]=r[sum-]+;
  37. r[sum]=en2;
  38. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  39. }
  40. void pushdown(const int &p)
  41. {
  42. if(delta[p])
  43. {
  44. for(int i=l[p];i<=r[p];i++) b[i]=;
  45. delta[p]=;
  46. }
  47. }
  48. inline void Insert(const int &x){pushdown(num[x]); b[x]++; sumv[num[x]]++; all++;}
  49. inline void Delete(const int &v)//删除小于等于v的所有权值
  50. {
  51. int used=all; pushdown(num[v]);
  52. for(int i=v;i>=l[num[v]];i--)
  53. {
  54. sumv[num[i]]-=b[i];
  55. all-=b[i];
  56. b[i]=;
  57. }
  58. for(int i=num[v]-;i>=;i--) if(sumv[i])
  59. {
  60. delta[i]=;
  61. all-=sumv[i];
  62. sumv[i]=;
  63. } leave+=(used-all);
  64. }
  65. inline int Kth(const int &x)
  66. {
  67. int cnt=;
  68. for(int i=sum;;i--)
  69. {
  70. cnt+=sumv[i];
  71. if(cnt>=x)
  72. {
  73. cnt-=sumv[i];
  74. for(int j=r[i];;j--)
  75. {cnt+=b[j]; if(cnt>=x) return j;}
  76. }
  77. }
  78. }
  79. int main()
  80. {
  81. R(n); R(m);
  82. for(int i=;i<=n;i++)
  83. {
  84. op[i]=getchar(); R(a[i]);
  85. if(op[i]=='I')
  86. {
  87. tmp[++en].v=a[i]-Infu;//为新员工消除之前工资变化的影响
  88. tmp[en].p=en;
  89. }
  90. else if(op[i]=='A') Infu+=a[i];
  91. else if(op[i]=='S')
  92. {
  93. Infu-=a[i];
  94. tmp[++en].v=m-Infu-;//每次删除<=m-Infu-1的权值
  95. tmp[en].p=en;
  96. }
  97. }
  98. sort(tmp+,tmp+en+);
  99. ma[c[tmp[].p]=++en2]=tmp[].v;
  100. for(int i=;i<=en;i++)
  101. {
  102. if(tmp[i].v!=tmp[i-].v) en2++;
  103. ma[c[tmp[i].p]=en2]=tmp[i].v;
  104. } Infu=en=; makeblock();
  105. for(int i=;i<=n;i++)
  106. {
  107. if(op[i]=='I') {en++; if(a[i]>=m) Insert(c[en]);}
  108. else if(op[i]=='A') Infu+=a[i];
  109. else if(op[i]=='S')
  110. {
  111. Infu-=a[i];
  112. Delete(c[++en]);
  113. }
  114. else
  115. {
  116. if(a[i]>all) puts("-1");
  117. else P(ma[Kth(a[i])]+Infu);
  118. }
  119. } P(leave);
  120. return ;
  121. }

【权值分块】bzoj1503 [NOI2004]郁闷的出纳员的更多相关文章

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

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

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

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

  3. [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

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

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

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

  5. 题解【bzoj1503 [NOI2004]郁闷的出纳员】

    Description 给出一个下限 \(m\) ,要求维护以下操作 插入一个数(如果小于下限就不加) 给每个数加上一个数 给每个数减去一个数,并且删除掉 \(< m\) 的所有数 求目前第 \ ...

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

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

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

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

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

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

  9. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

随机推荐

  1. Mysql History list length 值太大引起的问题

    1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4  64bit 2. 表面现象 数据库操 ...

  2. HDU 5670

    Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  3. 在Maven中怎么配置外部Jar

    转摘自:http://liugang594.iteye.com/blog/1677712 假设我们有一个Maven的project,其中有些Jar包不是来自Maven库的,是存在本地的某些Jar文件, ...

  4. css划斜线

    http://stackoverflow.com/questions/18012420/draw-diagonal-lines-in-div-background-with-css

  5. sender的作用

        https://www.evernote.com/shard/s227/sh/c2441a07-6b7e-4659-8452-9f768ee9cc66/73a115ed352421e10629 ...

  6. 【洛谷 SP2878】Knights of the Round Table(双联通分量)

    先放这吧,没时间写,明天再补 "明天到了" 题目链接 题意:求不在任何奇环内的点的数量. Tarjan求点双联通分量,然后再染色判断是不是二分图就好了. 只是不懂为什么Tarjan ...

  7. 单源最短路模板_SPFA_Dijkstra(堆优化)_C++

    随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点 void spfa() { int i,x,k; ;i<=n;i++) { d[i]=o ...

  8. 也说JS脚本加载控制

    问题背景 前端采用的 iframe + html 做后台管理系统.现在js.jquery插件非常多,每次页面都是引用就类似这样: <script src="../Scripts/jqu ...

  9. HDU1010(dfs+剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. nginx、apache、tomcat的区别

    1.Apache Apache支持模块化,性能稳定,Apache本身是静态解析,适合静态HTML.图片等,但可以通过扩展脚本.模块等支持动态页面等. 缺点:配置相对复杂,自身不支持动态页面. 2.To ...