郁闷的出纳员

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

第一次写平衡树,在网上拷了一份板子,但是只懂了一部分,里面的求前驱后继的代码是我在别的代码里粘贴进去的,有待测试。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 102
const int MAXN=2e5+100;
int lim;
struct SplayTree {int sz[MAXN];int ch[MAXN][2];int pre[MAXN];int rt,top;inline void up(int x) {sz[x]  = cnt[x]  + sz[ ch[x][0] ] + sz[ ch[x][1] ];}inline void Rotate(int x,int f) {int y=pre[x];ch[y][!f] = ch[x][f];pre[ ch[x][f] ] = y;pre[x] = pre[y];if(pre[x]) ch[ pre[y] ][ ch[pre[y]][1] == y ] =x;ch[x][f] = y;pre[y] = x;up(y);}inline void Splay(int x,int goal) { //将x旋转到goal的下面while(pre[x] != goal) {if(pre[pre[x]] == goal) Rotate(x, ch[pre[x]][0] == x);else   {int y=pre[x],z=pre[y];int f = (ch[z][0]==y);if(ch[y][f] == x) Rotate(x,!f),Rotate(x,f);else Rotate(y,f),Rotate(x,f);}}up(x);if(goal==0) rt=x;}inline void RTO(int k,int goal) { //将第k位数旋转到goal的下面int x=rt;while(sz[ ch[x][0] ] != k-1) {if(k < sz[ ch[x][0] ]+1) x=ch[x][0];else {k-=(sz[ ch[x][0] ]+1);x = ch[x][1];}}Splay(x,goal);}inline void vist(int x) {if(x) {printf("结点%2d : 左儿子  %2d   右儿子  %2d   %2d sz=%d\n",x,ch[x][0],ch[x][1],val[x],sz[x]);vist(ch[x][0]);vist(ch[x][1]);}}inline void Newnode(int &x,int c) {x=++top;ch[x][0] = ch[x][1] = pre[x] = 0;sz[x]=1;cnt[x]=1;val[x] = c;}inline void init() {sum=ch[0][0]=ch[0][1]=pre[0]=sz[0]=0;rt=top=0;cnt[0]=0;}inline void Insert(int &x,int key,int f) {if(!x) {Newnode(x,key);pre[x]=f;Splay(x,0);return ;}if(key==val[x]) {cnt[x]++;sz[x]++;Splay(x,0);return ;} else if(key<val[x]) {Insert(ch[x][0],key,x);} else {Insert(ch[x][1],key,x);}up(x);}//找前驱inline int Get_pre(int r) {if(ch[r][0] == 0)return -1;//不存在r = ch[r][0];while(ch[r][1])r = ch[r][1];return r;}//找后继inline int Get_next(int r) {if(ch[r][1] == 0)return -1;r = ch[r][1];while(ch[r][0])r = ch[r][0];return r;}void del(int &x,int f) {if(!x) return ;if(val[x]>=lim) {del(ch[x][0],x);} else {sum+=sz[ch[x][0]]+cnt[x];x=ch[x][1];pre[x]=f;if(f==0) rt=x;del(x,f);}if(x)  up(x);}inline void update() {del(rt,0);}inline int find_kth(int x,int k) {if(k<sz[ch[x][0]]+1) {return find_kth(ch[x][0],k);} else if(k > sz[ ch[x][0] ] + cnt[x] )return find_kth(ch[x][1],k-sz[ch[x][0]]-cnt[x]);else {Splay(x,0);return val[x];}}int cnt[MAXN];int val[MAXN];int sum;
} spt;
int main() {int n;int m;char op[5];scanf("%d%d",&n,&m);int w=0;spt.init();while(n--) {int k;scanf("%s%d",op,&k);if(op[0]=='I') {if(k<m) {continue;}spt.Insert(spt.rt,k-w,0);} else if(op[0]=='A') {w+=k;} else if(op[0]=='S') {w-=k;lim=m-w;spt.update();} else {int sz=spt.sz[spt.rt];if(k>sz)printf("-1\n");else {printf("%d\n",spt.find_kth(spt.rt,sz-k+1)+w);}}}printf("%d\n",spt.sum);return 0;
}

转载于:https://www.cnblogs.com/jianrenfang/p/6275450.html

HNOI2004 郁闷的出纳员(Splay)相关推荐

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

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

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

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

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

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

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

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

  5. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

  6. 【BZOJ1503】郁闷的出纳员

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

  7. [伸展树]codevs1286 郁闷的出纳员

    codevs1286 郁闷的出纳员 主要是删人的问题 找工资下界,找得到的话就把他的左子树删掉删掉! 如果没有人刚好在工资下界 那么-. 找工资下界的后继,把后继的左子树删掉删掉! 如果后继为零,也就 ...

  8. 洛谷P1486 [NOI2004] 郁闷的出纳员 题解

    P1486 [NOI2004] 郁闷的出纳员 题目链接:P1486 [NOI2004] 郁闷的出纳员 题意:维护一个数据结构,支持 插入一个大小为 kkk​ 的值,小于下界时不插入 所有元素加上 kk ...

  9. bzoj1503: [NOI2004]郁闷的出纳员

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题目: 1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  ...

最新文章

  1. 输入重定向,输出重定向,管道相关内容及实现方法
  2. 手机贷服务器维护升级,手机贷服务器升级
  3. 为什么要研究游戏 AI 呢?
  4. java创建对象的5种方法
  5. VB.NET 调用外部程序
  6. 深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天
  7. django 的ORM
  8. 如果给你一个亿,你想去干嘛?各专业的科研狗是这样回答的……
  9. mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
  10. css背景图background - 多背景定义
  11. 矩阵论思维导图_全新思维导图
  12. Linux系统X服务漏洞,X.Org X Server本地拒绝服务漏洞(CVE-2013-6424)
  13. Python操作数据库完成接口测试
  14. 关于参数的写法规则,参数引用几种写法
  15. 易筋SpringBoot 2.1 | 第三十篇:SpringBoot Reactor响应式编程介绍
  16. C语言判断素数的几种方法
  17. flask +layUI+ ajax 上传图片
  18. Java环境变量配置cobalt strick4.4启动
  19. 这几种食物不要给1岁内宝宝吃
  20. 泛函分析复习笔记(一)度量空间

热门文章

  1. 【iOS开发】使用XCode 10添加Launch Image(启动图片)
  2. Oracle监控的关键指标有哪些
  3. event.target
  4. JDK 8_jstack命令使用
  5. WinLicense下载购买地址
  6. 闲话WPF之六(XAML的标记兼容性(Markup Compaibility))
  7. Linux 命令(121)—— cal 命令
  8. C++11 Unicode 支持
  9. Ubuntu搭建Anki服务器
  10. 【POJ 1860】Currency Exchange