Description

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

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

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

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

Solution

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

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

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

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

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

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

Code

#include <cstdio>
#include <algorithm>
#define N 100010
#define lc(x) T[(x)][0]
using namespace std;int n,m,rt,tot,T[N][2],k[N],fa[N],s[N],tag,num;void rotate(int p){int q=fa[p],y=fa[q],x=(T[q][1]==p);T[q][x]=T[p][x^1],fa[T[q][x]]=q;T[p][x^1]=q,fa[q]=p;fa[p]=y;if(y){if(T[y][0]==q) T[y][0]=p;else if(T[y][1]==q) T[y][1]=p;}s[p]=s[q];s[q]=s[T[q][0]]+s[T[q][1]]+1;
}void splay(int x){for(int y;y=fa[x];rotate(x))if(fa[y]) rotate((x==lc(y))==(y==lc(fa[y]))?y:x);rt=x;
}void Insert(int v){if(!rt){rt=++tot;T[rt][0]=T[rt][1]=0;k[rt]=v;fa[rt]=0;s[rt]=1;return;}   int x=rt,y;while(1){s[x]++;y=T[x][k[x]<v];if(!y){y=++tot;k[y]=v;fa[y]=x;s[y]=1;T[y][0]=T[y][1]=0;T[x][k[x]<v]=y;break;}x=y;}splay(y);
}void Del(int x){splay(x);num+=s[T[x][0]]+1;rt=T[x][1];fa[rt]=0;
}void DEL(){int x=rt;while(x){int u=0;if(k[x]+tag>=m) x=T[x][0];else u=x,x=T[x][1];if(u) Del(u);}
}int Find(int x){int r=0;for(int u=rt;;){if(s[T[u][1]]+r+1==x) return k[u];if(s[T[u][1]]+r+1<x) r+=s[T[u][1]]+1,u=T[u][0];else u=T[u][1];}
}int main(){scanf("%d%d",&n,&m);while(n--){char ch=getchar();int t;while(ch!='I'&&ch!='A'&&ch!='S'&&ch!='F') ch=getchar();scanf("%d",&t);if(ch=='I'&&t>=m) Insert(t-tag);else if(ch=='A') tag+=t;else if(ch=='S') {tag-=t;DEL();}else if(ch=='F'){if(t>s[rt]) printf("-1\n");else printf("%d\n",Find(t)+tag);}}printf("%d\n",num);return 0;
}

转载于:https://www.cnblogs.com/void-f/p/8394795.html

[BZOJ1503]郁闷的出纳员(Splay)相关推荐

  1. [bzoj2733]永无乡 [bzoj1503]郁闷的出纳员

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1321  Solved: 693 [Submit][Stat ...

  2. 950. 郁闷的出纳员(Splay树)

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

  3. 郁闷的出纳员(splay, 树状数组可做)

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

  4. bzoj1503 郁闷的出纳员

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

  5. bzoj1503 郁闷的出纳员(平衡树,思维)

    题目大意: 现在有n个操作和一个最低限度m \(I\)命令\(I\ k\)新建一个工资档案,初始工资为k. \(A\)命令$A k $把每位员工的工资加上k \(S\)命令$S k $把每位员工的工资 ...

  6. HYSBZ - 1503 郁闷的出纳员(Splay)

    题目链接:点击查看 题目大意:中文题 题目分析:利用Splay加一点思维还是比较容易解决的,对于所有员工加工资以及减工资的操作,别看只有100次,如果是暴力修改的话,时间复杂度能达到1e7,常数稍大点 ...

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

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

  8. HNOI2004 郁闷的出纳员(Splay)

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

  9. 【BZOJ1503】郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 11250  Solved: 3962 [Submit][St ...

最新文章

  1. usr libexec java_osx – 如何更改从/ usr/libexec/java_home返回的Mac操作系统的默认Java虚拟机...
  2. Open×××的Linux内核版,鬼魅的残缺 part I:The PROTOCOL
  3. kerberos认证_初识 Windows域认证体系 Kerberos认证
  4. Angular input控件的click事件表达式如何被转换成JavaScript函数
  5. POJ3177 Redundant Paths
  6. 机器学习算法总结--SVM
  7. 分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”
  8. Java错误提示框口怎么使用_如何在Swing中显示错误消息对话框?
  9. 电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...
  10. 管理后台--4,删除分类
  11. Python文摘:汉诺塔问题与递归算法
  12. 基于51单片机的CC2541蓝牙透传模块的无线通信
  13. Unity3d Network 局域网多人对战之游戏大厅
  14. HTML5 界面元素 Canvas 参考手册
  15. Burp Suite CA证书下载及导入教程
  16. Android控制所有播放器的音频切换上下首歌、播放、停止
  17. opencv------图片转化为视频
  18. 求最大公约数和最小公倍数-python3
  19. c语言语法要素,第6章DSP_C语言程序设计要素.ppt
  20. 关于洗地机电池容量问题,你怎么看

热门文章

  1. SpringCloud 微服务架构,适合接私活(附源码)
  2. 为什么不建议你用a.equals(b)判断对象相等
  3. 盘点开发中那些常用的MySQL优化
  4. 在吗?认识一下JWT(JSON Web Token) ?
  5. 你想过 Controller 这些方法里的参数是如何工作的吗?
  6. 代码神器:拒绝重复编码,这款IDEA插件了解一下.....
  7. 李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布
  8. Python的常用包有哪些,分别有什么作用?
  9. 想“看见”高性能计算嘛?戳这里开始
  10. 国务院任命!清华、北航分别迎来新任副校长