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
 
直接用Treap来维护第K大公司。
每来一个员工如果给的工资大于期望,那么就扔进Treap里面。
加工资直接循环,减工资时,如果当期那点小于期望,就删了。
注意几个细节:
删点重复的直接一起删。
一定要先删点,然后再减工资,要不然删一半时二叉搜索树性质无法保证。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <queue>
#define in(a) a=read()
#define MAXN 200010
#define REP(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
struct node{
int data,l,r,key,c,size;
}tree[MAXN];
int n,m,total,root,fair[MAXN],ans;
int dis=;
inline void update(int i){
tree[i].size=tree[tree[i].l].size+tree[tree[i].r].size+tree[i].c;
return ;
}
inline int ran(){
int t=rand();
return (t*68901935LL)%;
}
inline void zag(int &i){
int t=tree[i].r;
tree[i].r=tree[t].l;
tree[t].l=i;
tree[t].size=tree[i].size;
update(i);
i=t;
return ;
}
inline void zig(int &i){
int t=tree[i].l;
tree[i].l=tree[t].r;
tree[t].r=i;
tree[t].size=tree[i].size;
update(i);
i=t;
return ;
}
inline void insert(int &i,int k){
if(!i){
i=++total;
tree[i].data=k;
tree[i].key=ran();
tree[i].c=tree[i].size=;
return ;
}
tree[i].size++;
if(tree[i].data==k) tree[i].c++;
else if(k<tree[i].data){
insert(tree[i].l,k);
if(tree[tree[i].l].key<tree[i].key) zig(i);
}
else{
insert(tree[i].r,k);
if(tree[tree[i].r].key<tree[i].key) zag(i);
}
return ;
}
inline void delate(int &i,int k){
if(!i) return ;
if(i==k){
if(!tree[i].l || !tree[i].r) i=tree[i].l+tree[i].r;
else if(tree[tree[i].l].key<tree[tree[i].r].key) zig(i),delate(i,k);
else zag(i),delate(i,k);
}
else if(tree[k].data<tree[i].data) tree[i].size-=tree[k].c,delate(tree[i].l,k);
else tree[i].size-=tree[k].c,delate(tree[i].r,k);
return ;
}
inline int getnum(int i,int k){
if(!i) return -;
if(tree[tree[i].r].size>=k) return getnum(tree[i].r,k);
k-=tree[tree[i].r].size;
if(tree[i].c>=k){
return tree[i].data;
}
k-=tree[i].c;
return getnum(tree[i].l,k);
}
int main(){
in(n);in(m);
char c;
int a;
REP(Stan,,n){
cin>>c;in(a);
if(c=='I'){
if(a<m) continue;
insert(root,a);
}
if(c=='A')
REP(i,,total) if(!fair[i]) tree[i].data+=a;
if(c=='S'){
REP(i,,total){
if(fair[i]) continue;
if(tree[i].data-a<m){
ans+=tree[i].c,delate(root,i),fair[i]=;
}
}
REP(i,,total)
if(!fair[i]) tree[i].data-=a;
}
if(c=='F'){printf("%d\n",getnum(root,a));}
}
cout<<ans<<endl;
return ;
}

bzoj1503 郁闷的出纳员的更多相关文章

  1. [BZOJ1503]郁闷的出纳员(Splay)

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

  2. BZOJ1503——郁闷的出纳员

    1.题目大意:一道treap题,支持插入,询问第K大,还有全体修改+上一个值,如果某个点值小于x,那么就删除这个点 插入100000次,询问100000次,修改100次..最后输出删了多少个点 2.分 ...

  3. bzoj1503 郁闷的出纳员 splay版

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

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

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

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

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

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

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

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

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

  8. 【bzoj1503】[NOI2004]郁闷的出纳员

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

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

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

随机推荐

  1. cmd 概览---- 转

    打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口... 也可以通过cmd /c 命令 和 cmd /k 命令的方式来直接运行命令 注:/c表示执行完命令后关闭cmd ...

  2. Brief History of Machine Learning

    Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, ...

  3. 各种奇妙的hack

    Android Selector Hacks WebKit .selector:not(*:root) {} Chrome * Safari * Opera ≥ 14 Android * # Java ...

  4. [转载]Markdown——入门指南

    http://www.jianshu.com/p/1e402922ee32/ 转载请注明原作者,如果你觉得这篇文章对你有帮助或启发,也可以来请我喝咖啡. 导语: Markdown 是一种轻量级的「标记 ...

  5. JavaScript 删除 ASP.NET 设置的多值 Cookie 的方法

    需要注意HttpOnly,Path等属性.完整的测试代码: ASPX 代码<%@ Page Language="C#" %> <!DOCTYPE html PUB ...

  6. Flex 程序执行顺序!

    Flex 执行加载过程会有几个概念:preloader, SystemManager, Flex Application! flex 界面初始化时,看到的 Loading 加载条,那是 flex 自动 ...

  7. leaflet-velocity 参数

    本文地址: https://www.cnblogs.com/veinyin/p/10769611.html  leaflet-velocity 是 leaflet 绘制风场的一个插件,其控制参数如下所 ...

  8. A - Jugs ZOJ - 1005 (模拟)

    题目链接:https://cn.vjudge.net/contest/281037#problem/A 题目大意:给你a,b,n.a代表第一个杯子的容量,b代表第二个杯子的容量,然后一共有6种操作.让 ...

  9. MVC常用特性使用

    简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常 ...

  10. IIS 无法识别的属性“targetFramework”---解决之道

    在安装VS2010后,应用.NET Framework 4创建的网站放在IIS(7.0)下会出现如下的错误: 其中的“版本信息”中告诉了我们.NET Framework和ASP.NET的版本都是2.0 ...