Description

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。

工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。

老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?

PS:最后还要求出踢出员工的数量

Solution

首先这题要求数列第K大的数,涉及到插入、删除和修改,

修改是对于整个数列,显然不能一个一个改,记录一个类似lazy_tag的标记即可

插入的时候将Num减去tag再插入

全体增加直接累加tag就行,但全体减少的话可能会踢人,进行删除操作判断

在删除的时候统计删除节点数目

Tips:插入对于s(u)的维护,需要考虑到父节点们,被坑了好久

Code

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 100010
  4. #define lc(x) T[(x)][0]
  5. using namespace std;
  6. int n,m,rt,tot,T[N][2],k[N],fa[N],s[N],tag,num;
  7. void rotate(int p){
  8. int q=fa[p],y=fa[q],x=(T[q][1]==p);
  9. T[q][x]=T[p][x^1],fa[T[q][x]]=q;
  10. T[p][x^1]=q,fa[q]=p;
  11. fa[p]=y;
  12. if(y){
  13. if(T[y][0]==q) T[y][0]=p;
  14. else if(T[y][1]==q) T[y][1]=p;
  15. }
  16. s[p]=s[q];
  17. s[q]=s[T[q][0]]+s[T[q][1]]+1;
  18. }
  19. void splay(int x){
  20. for(int y;y=fa[x];rotate(x))
  21. if(fa[y]) rotate((x==lc(y))==(y==lc(fa[y]))?y:x);
  22. rt=x;
  23. }
  24. void Insert(int v){
  25. if(!rt){
  26. rt=++tot;
  27. T[rt][0]=T[rt][1]=0;
  28. k[rt]=v;
  29. fa[rt]=0;
  30. s[rt]=1;
  31. return;
  32. }
  33. int x=rt,y;
  34. while(1){
  35. s[x]++;
  36. y=T[x][k[x]<v];
  37. if(!y){
  38. y=++tot;
  39. k[y]=v;
  40. fa[y]=x;
  41. s[y]=1;
  42. T[y][0]=T[y][1]=0;
  43. T[x][k[x]<v]=y;
  44. break;
  45. }
  46. x=y;
  47. }
  48. splay(y);
  49. }
  50. void Del(int x){
  51. splay(x);
  52. num+=s[T[x][0]]+1;
  53. rt=T[x][1];
  54. fa[rt]=0;
  55. }
  56. void DEL(){
  57. int x=rt;
  58. while(x){
  59. int u=0;
  60. if(k[x]+tag>=m) x=T[x][0];
  61. else u=x,x=T[x][1];
  62. if(u) Del(u);
  63. }
  64. }
  65. int Find(int x){
  66. int r=0;
  67. for(int u=rt;;){
  68. if(s[T[u][1]]+r+1==x) return k[u];
  69. if(s[T[u][1]]+r+1<x) r+=s[T[u][1]]+1,u=T[u][0];
  70. else u=T[u][1];
  71. }
  72. }
  73. int main(){
  74. scanf("%d%d",&n,&m);
  75. while(n--){
  76. char ch=getchar();int t;
  77. while(ch!='I'&&ch!='A'&&ch!='S'&&ch!='F') ch=getchar();
  78. scanf("%d",&t);
  79. if(ch=='I'&&t>=m) Insert(t-tag);
  80. else if(ch=='A') tag+=t;
  81. else if(ch=='S') {tag-=t;DEL();}
  82. else if(ch=='F'){
  83. if(t>s[rt]) printf("-1\n");
  84. else printf("%d\n",Find(t)+tag);
  85. }
  86. }
  87. printf("%d\n",num);
  88. return 0;
  89. }

[BZOJ1503]郁闷的出纳员(Splay)的更多相关文章

  1. bzoj1503 郁闷的出纳员 splay版

    自己yy的写法 可能有点奇怪吧 详情看代码 还是蛮短的 #include<cstdio> #include<cstring> #include<algorithm> ...

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

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

  3. NOI2004 郁闷的出纳员 Splay

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

  4. bzoj 1503郁闷的出纳员(splay)

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

  5. 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

    splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...

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

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

  7. bzoj1503[NOI2004]郁闷的出纳员——Splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...

  8. 洛谷P1486 [NOI2004]郁闷的出纳员(splay)

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

  9. 【NOI2004】郁闷的出纳员 - Splay

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

随机推荐

  1. linux下的idea的界面问题,错位以及各种...

    问题 ’ 方法 主题设置为GTK,多余的点会消失,而且字体也会好很多

  2. eros 修改 android上原生picker的颜色的呢

    修改选中颜色和文字颜色 修改文件如下 修改窗口底色

  3. weex 项目搭建

    第一步:安装依赖 npm install -g weex-toolkit weex -v //查看当前weex版本 weex update weex-devtool@latest //@后标注版本后, ...

  4. Vue日历

    Vue生成日历,根据返回值将日期标红 HTML: <h1>CSS 日历</h1> <div id="calendar"> <div cla ...

  5. echo -e的用法

    root@bt:~# echo -e "HEAD /HTTP/1.0\n\n"HEAD /HTTP/1.0 root@bt:~# echo -e "HEAD /HTTP/ ...

  6. 腾讯云服务器手动和自动安装WordPress网站程序

    如果我们需要建站的话,对于基础个人网站.博客建站选择基础的1Mbps带宽配置的1GB内存的腾讯云服务器还是够用的,且如果我们需要用来建网站的话可以手工添加程序,以及有些面板,比如宝塔面板是自带CMS程 ...

  7. windows下php7.1.5、mysql环境搭建

    php http://windows.php.net/download/ 如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本:而用FastCGI模式运行PHP的话就 ...

  8. [VC]vc中socket编程步骤

    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW): 基于TCP的socket编程是采用的流式套接字.在这个 ...

  9. IOS autosizing(设置控件的固定位置大小)

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  10. 【洛谷2522】[HAOI2011] Problem b(莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)==k]\). 关于另一道题目 在看这篇博客之前,如果你做过一道叫做[BZOJ1101][POI2007 ...