Description

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
 
 
 
 
平衡树直接扔
 
SBT:
#include<cstdio>
#include<algorithm>
using namespace std; struct na{
int l,r,k,s;
na(){
l=r=k=s=;
}
};
int root=,num=,ans=;
long n,m,k;
na t[];
inline void rir(int &p){
int q=t[p].l;
t[p].l=t[q].r;
t[q].r=p;
t[q].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=q;
}
inline void ler(int &p){
int q=t[p].r;
t[p].r=t[q].l;
t[q].l=p;
t[q].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=q;
}
void ph(int &p,bool bo){
if (!bo){
if (t[t[p].r].s<t[t[t[p].l].l].s) rir(p);else
if (t[t[p].r].s<t[t[t[p].l].r].s){
ler(t[p].l);
rir(p);
}else return;
}else{
if (t[t[p].l].s<t[t[t[p].r].r].s) ler(p);else
if (t[t[p].l].s<t[t[t[p].r].l].s){
rir(t[p].r);
ler(p);
}else return;
}
ph(t[p].l,);
ph(t[p].r,);
ph(p,);
ph(p,);
}
void insert(int &p,int key){
if (p==){
num++;
p=num;
t[num].k=key;
t[num].s=;
}else{
t[p].s++;
if (t[p].k>key)insert(t[p].l,key);
else insert(t[p].r,key);
}
ph(p,t[p].k<=key);
}
void del(int &p,int key){
if (p==){
return;
}
if (t[p].k<key){
ans+=t[t[p].l].s+;
del(p=t[p].r,key);
}else{
del(t[p].l,key);
t[p].s=t[t[p].l].s+t[t[p].r].s+;
}
ph(p,);
ph(p,);
}
int que(int p,int key){
if (key==t[t[p].r].s+) return t[p].k;
if (key<t[t[p].r].s+) return que(t[p].r,key);
if (key>t[t[p].r].s+) return que(t[p].l,key-t[t[p].r].s-);
}
int main(){
scanf("%d%d",&n,&m);
k=;
for (int i=;i<n;i++){
char c[];int b;
scanf("%s%d",c,&b);
if (c[]=='I'){
if (b>=m) insert(root,b-k);
}
if (c[]=='A'){
k+=b;
}
if (c[]=='S'){
k-=b;
del(root,m-k);
}
if (c[]=='F'){
if (b>t[root].s) puts("-1");else
printf("%d\n",que(root,b)+k);
}
}
printf("%d",ans);
return ;
}

SPLAY:

#include<cstdio>
#include<algorithm>
using namespace std; struct na{
int l,r,k,s,f;
na(){
l=r=k=s=;
}
};
int root=,num=,ans=,p,qq;
long n,m,k;
na t[];
char ch;
inline int read(){
p=;ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') p=p*+ch-, ch=getchar();
return p;
}
inline bool getc(int x){
return t[t[x].f].l==x;
}
inline void lturn(int &p){
int k=t[p].r;
t[k].f=t[p].f;
t[p].f=k;
t[t[k].l].f=p;
t[p].r=t[k].l;
t[k].l=p;
t[k].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=k;
}
inline void rturn(int &p){
int k=t[p].l;
t[k].f=t[p].f;
t[p].f=k;
t[t[k].r].f=p;
t[p].l=t[k].r;
t[k].r=p;
t[k].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=k;
}
inline void ph(int &x,bool bo){
if (bo) rturn(x);else lturn(x);
}
inline void splay(int l){
while (l!=root&&l){
if (t[l].f==root){
ph(root,getc(l));
break;
}
int p=t[t[l].f].f;
if (getc(l)==getc(t[l].f)){
if (p==root){
ph(root,getc(t[l].f));
ph(root,getc(l));
break;
}else{
if (getc(p)) ph(t[t[p].f].l,getc(t[l].f));else ph(t[t[p].f].r,getc(t[l].f));
if (getc(t[l].f)) ph(t[t[t[l].f].f].l,getc(l));else ph(t[t[t[l].f].f].r,getc(l));
}
}else{
if (p==root){
if (getc(t[l].f)) ph(t[t[t[l].f].f].l,getc(l));else ph(t[t[t[l].f].f].r,getc(l));
ph(root,getc(l));
break;
}else{
if (getc(t[l].f)) ph(t[t[t[l].f].f].l,getc(l));else ph(t[t[t[l].f].f].r,getc(l));
if (getc(p)) ph(t[t[p].f].l,getc(l));else ph(t[t[p].f].r,getc(l));
}
}
}
}
inline void insert(int &p,int k,int f){
if (p==){
num++;
t[num].k=k;
t[num].f=f;
t[num].s=;
p=num;
splay(p);
}else{
t[p].s++;
if (k>t[p].k) insert(t[p].r,k,p);else insert(t[p].l,k,p);
}
}
inline void del(int &p,int key){
if (p==){
t[p].s=;
return;
}
if (t[p].k<key){
ans+=t[t[p].l].s+;
t[t[p].r].f=t[p].f;
del(p=t[p].r,key);
}else{
del(t[p].l,key);
}
if (p!=) t[p].s=t[t[p].l].s+t[t[p].r].s+;
}
inline int que(int p,int key){
qq=p;
if (key==t[t[p].r].s+) return t[p].k;
if (key<t[t[p].r].s+) return que(t[p].r,key);
if (key>t[t[p].r].s+) return que(t[p].l,key-t[t[p].r].s-);
}
int main(){
n=read();m=read();
k=;
for (register int i=;i<n;i++){
char c[];int b;
scanf("%s",c);b=read();
if (c[]=='I'){
if (b>=m) insert(root,b-k,);
}else
if (c[]=='A'){
k+=b;
}else
if (c[]=='S'){
k-=b;
del(root,m-k);
}else
if (c[]=='F'){
if (b>t[root].s) puts("-1");else
printf("%d\n",que(root,b)+k),splay(qq);
}
}
printf("%d",ans);
return ;
}

TREAP:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std; struct na{
int l,r,k,s,ra;
na(){
l=r=k=s=;
}
};
int root=,num=,ans=;
long n,m,k;
na t[];
inline void rir(int &p){
int q=t[p].l;
t[p].l=t[q].r;
t[q].r=p;
t[q].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=q;
}
inline void ler(int &p){
int q=t[p].r;
t[p].r=t[q].l;
t[q].l=p;
t[q].s=t[p].s;
t[p].s=t[t[p].l].s+t[t[p].r].s+;
p=q;
}
inline void insert(int &p,int key){
if (p==){
num++;
p=num;
t[num].k=key;
t[num].s=;
t[num].ra=rand();
}else{
t[p].s++;
if (t[p].k>key){
insert(t[p].l,key);
if (t[t[p].l].ra<t[p].ra) rir(p);
}
else{
insert(t[p].r,key);
if (t[t[p].r].ra<t[p].ra) ler(p);
}
}
}
inline void del(int &p,int key){
if (p==){
return;
}
if (t[p].k<key){
ans+=t[t[p].l].s+;
del(p=t[p].r,key);
}else{
del(t[p].l,key);
t[p].s=t[t[p].l].s+t[t[p].r].s+;
}
}
inline int que(int p,int key){
if (key==t[t[p].r].s+) return t[p].k;
if (key<t[t[p].r].s+) return que(t[p].r,key);
if (key>t[t[p].r].s+) return que(t[p].l,key-t[t[p].r].s-);
}
int main(){
scanf("%d%d",&n,&m);
srand(n+m);
k=;
for (int i=;i<n;i++){
char c[];int b;
scanf("%s%d",c,&b);
if (c[]=='I'){
if (b>=m) insert(root,b-k);
}
if (c[]=='A'){
k+=b;
}
if (c[]=='S'){
k-=b;
del(root,m-k);
}
if (c[]=='F'){
if (b>t[root].s) puts("-1");else
printf("%d\n",que(root,b)+k);
}
}
printf("%d",ans);
return ;
}

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

  1. 数据结构(跳跃表):NOI 2004 郁闷的出纳员

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

  2. NOI 2004 郁闷的出纳员(平衡树)

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

  3. [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...

  4. 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap

    思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...

  5. bzoj 1503[NOI 2004] 郁闷的出纳员

    题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...

  6. 【NOI】2004 郁闷的出纳员

    [算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...

  7. c++之路进阶——codevs1286(郁闷的出纳员)

    1286 郁闷的出纳员 2004年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description OIER公司 ...

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

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

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

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

随机推荐

  1. SQLMap安装步骤

    SQLMap是利用Python语言写的,所以需要将Python这个语言环境给安装上 : 1.首先下载Python(这里Python版本为2.7.2,可以下载不同或高版本的) 2.然后在下载sqlmap ...

  2. JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建

    在JMeter接口测试不断深入的过程中,发现可以和jenkins和ant一起搭配进行自动化的构建.下面是jmeter自动化构建的整理笔记. 准备环境 需要本机上确定安装了jmeter.ant和jenk ...

  3. mongodb命令行基础语法

    首先是安装并配置mongodb,这个请自行百度,安装完成后打开cmd命令输入mongo.我们现在先做一个例子吧,假设有一个班级叫c1,里面有若干个人,里面的人有姓名.年龄.性别和班级,我们分别对他们进 ...

  4. mvn命令笔记

    #发布到本地仓库 mvn deploy -DaltDeploymentRepository=snapshots::default::http://mvnrepo.xxx.com/mvn/snapsho ...

  5. 创建access数据库表demo的封装

    1.创建类 public void CreateBiao(ADOX.Catalog catlog,ADOX.Table table) { //StuId Column(AutoIncrement ) ...

  6. php iconv 函数参数的区别

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/57 用户输入:英特尔® 酷睿™ i7处理器大显身手 case1 ...

  7. Arcade初探[0] 目录与导航

    2017年6月,ESRI开发者页面出现了一个新玩意儿:Arcade. 连接:点我 这是什么东西呢?有什么用呢? 1. 是什么 Arcade一种表达语言,可以在ArcGIS平台上使用.不管是编写简单的脚 ...

  8. userdel 命令详解

    userdel  作用: 删除指定用户,以及用户相关的文件. 如不加选项,则仅删除用户账号,而不删除相关文件 选项: -f:强制删除用户,即时用户当前已登录 -r:删除用户的同时删除与用户相关的所有文 ...

  9. Python列表操作

    自带帮助文档: >>> help(list) Help on class list in module builtins: class list(object) | list() - ...

  10. Robot Framework 学习笔记(二)-------第一个脚本

    robot Framework环境搭建好之后先来一个简单的脚本跑一下 一.新建项目 二.新建测试套件  三.创建测试用例 四.导入Selenium2Library库 因为RF框架编写基于web 的测试 ...