链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1503

题面:

1503: [NOI2004]郁闷的出纳员

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 14257  Solved: 5253
[Submit][Status][Discuss]

Description

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的
工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好
,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我
真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位
员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员
工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘
了一位新员工,我就得为他新建一个工资档案。老板经常到我这边来询问工资情况,他并不问具体某位员工的工资
情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后
告诉他答案。好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样
,不是很困难吧?

Input

第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。
接下来的n行,每行表示一条命令。命令可以是以下四种之一:
名称 格式 作用
I命令 I_k 新建一个工资档案,初始工资为k。
如果某员工的初始工资低于工资下界,他将立刻离开公司。
A命令 A_k 把每位员工的工资加上k
S命令 S_k 把每位员工的工资扣除k
F命令 F_k 查询第k多的工资
_(下划线)表示一个空格,I命令、A命令、S命令中的k是一个非负整数,F命令中的k是一个正整数。
在初始时,可以认为公司里一个员工也没有。
I命令的条数不超过100000 
A命令和S命令的总条数不超过100 
F命令的条数不超过100000 
每次工资调整的调整量不超过1000 
新员工的工资不超过100000

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
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 2e5+10;
const int inf = 0x3f3f3f;
int n,m,sz,rt,mn,add;
int c[M][2],fa[M],tag[M],v[M],siz[M];inline void pushup(int k){int l = c[k][0],r = c[k][1];siz[k] = siz[l] + siz[r] + 1;
}void rotate(int x,int &k){int y = fa[x],z = fa[y],l,r;if(c[y][0] == x) l = 0;else l = 1;r = l^1;if(y == k) k = x;else {if(c[z][0]==y) c[z][0]=x;else c[z][1] = x;}fa[x] = z;fa[y] = x;fa[c[x][r]]=y;c[y][l]=c[x][r]; c[x][r]=y;pushup(y); pushup(x);
}void splay(int x,int &k){while(x != k){int y = fa[x],z = fa[y];if(y != k){if(c[y][0]==x^c[z][0]==y)rotate(x,k);else rotate(y,k);}rotate(x,k);}
}inline int Find(int k,int rk){int l = c[k][0],r = c[k][1];if(siz[r] + 1 == rk) return v[k];else if(siz[r] >= rk) return Find(r,rk);else return Find(l,rk-siz[r]-1);
}inline void ins(int &k,int val,int last){if(k == 0){k = ++sz;v[k] = val;siz[k] = 1;fa[k] = last;return ;}if(val < v[k]) ins(c[k][0],val,k);else ins(c[k][1],val,k);pushup(k);
}inline int del(int &k,int last){if(k == 0) return 0;int ret = 0;if(v[k] + add < mn){ret = 1 + siz[c[k][0]] + del(c[k][1],last);siz[c[k][1]] = siz[k] - ret;k = c[k][1];fa[k] = last;}else{ret = del(c[k][0],k);siz[k] = siz[k] - ret;}return ret;
}int main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);string op;int x;add = 0;cin>>n>>mn;int ans = 0;for(int i = 1;i <= n;i ++){cin>>op>>x;if(op[0] == 'I'&&x >= mn) ins(rt,x-add,0),splay(sz,rt);else if(op[0] == 'S') add -= x,ans += del(rt,0);else if(op[0] == 'A') add += x;else if(op[0] == 'F'){if(siz[rt] < x) cout<<-1<<endl;else cout<<Find(rt,x)+add<<endl;}}cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/kls123/p/10712137.html

bzoj 1503: [NOI2004]郁闷的出纳员 (splay)相关推荐

  1. BZOJ 1503: [NOI2004]郁闷的出纳员 Treap

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

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

    SB平衡树 #include<cstdio> #define MN 100000 #define L(x) c[x][0] #define R(x) c[x][1] #define rtf ...

  3. BZOJ 1503 [NOI2004] 郁闷的出纳员 treap

    题意: 链接 方法: treap 解析: 这是本蒟蒻的第二道treap题,第二遍写的时候update,左旋右旋,插入函数都可以大概写出来了(还是得练啊),然而del  函数却被虐了,自己也想到用个什么 ...

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

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

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

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

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

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

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

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

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

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

  9. BZOJ1503:[NOI2004]郁闷的出纳员——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...

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

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 [我的感受] 这题郁闷了很久,因为discuss里讨论的问题和我都不是一个问题... ...

最新文章

  1. linux系统怎么用vim,linux/unix
  2. dji大疆机器人冬令营_2019RoboMaster高中生机器人冬令营火热进行中
  3. QT绘制带有数据源的图表
  4. springboot 和 mybatis整合:参数查询和动态sql
  5. MySQL datediff()函数
  6. 北京航空航天大学计算机科学与工程系,北航郑征主页 北京航空航天大学教师个人主页系统...
  7. springboot 微服务_使用 Docker 部署 Spring Boot微服务
  8. 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
  9. LVS+ldirector实现负载均衡
  10. 终于有一次,排名没有进步
  11. 【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发
  12. 电源完整性之Cadence Sigrity Power DC_电热协同仿真
  13. 是时候让打字更“快舒”了-小鹤双拼
  14. 使用wps-excell画折线图
  15. centos安装git时出错提示make[1]: *** [perl.mak] Error 2 make: *** [perl/perl.mak] Error 2
  16. GAN (Generative Adversarial Nets 生成对抗网络)
  17. 电信业Hadoop应用分析
  18. 2022跨考华中科技大学计算机学院学硕上岸经验分享
  19. MYSQL 更改初始 ROOT 密码
  20. 欧盟GDPR通用数据保护条例-原文

热门文章

  1. java递归求和 1 n_Java递归求和1+2+3+...+n实例详解
  2. 什么时候不该使用es6箭头函数
  3. MySQL8的新特性ROLE
  4. LNMP平台部署及应用
  5. Mac的一些使用技巧
  6. gitgithub拾遗(一)——git
  7. oracle创建dblink问题
  8. [转载] 民兵葛二蛋——第9集
  9. puppet经典应用
  10. VMware View虚拟桌面在安卓平板电脑上的演示