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. 嵌套查询别名必须性示例。HAVING用法

    HAVING的一个重要作用: SELECT子句有统计函数嵌套时SELECT子句不能出现GROUP BY列,如果需要显示此列可以把嵌套的统计函数写成子查询放在HAVING子句中. 可用HAVING简化语 ...

  2. CROSS JOIN,NATURAL JOIN

    CROSS JOIN:笛卡尔积 NATURAL JOIN:

  3. IX-Protected Dataplane Operating System解读

    一.概述 商业操作系统在应用程序每秒钟需要数百万次操作时才能保持高吞吐量和低(尾)延迟,对于最慢的请求只需几百微秒.通常认为对于高性能网络(小信息的高包率.低延迟)的构建,最好都是在内核之外构建用户态 ...

  4. [array] leetcode-56. Merge Intervals - Medium

    leetcode-56. Merge Intervals - Medium descrition Given a collection of intervals, merge all overlapp ...

  5. BGP网络学习总结

    1.前言     云计算在中国发展越来越快,企业逐步开始将业务迁移到公有云中,方便运维,节省成本.公有云最复杂的地方是网络,客户对网络的需求千奇百怪,造成网络环境极其复杂,稍有不慎,就会出现网络连通性 ...

  6. 在html中使用js

    1.使用defer属性可以让脚本在文档完全呈现出来之后在执行,延迟脚本总是按照制定他们的顺序进行. 2.使用async属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现,不能保证异步顺序按照它们 ...

  7. HTTPS加密流程超详解(二)

    2.进入正题 上篇文章介绍了如何简单搭建一个环境帮助我们分析,今天我们就进入正题,开始在这个环境下分析. 我们使用IE浏览器访问Web服务器根目录的test.txt文件并抓包,可以抓到如下6个包(前面 ...

  8. Rstudio( bioconductor)下载太慢,用国内镜像

    在Rstudio中,下载软件install.packages()和 bioconductor软件下载命令 source("http://bioconductor.org/biocLite.R ...

  9. SegmentFault错误汇总

    在三个月的工作中,经常碰到SegmentFault的错误,有时候是因为计算集群问题导致,更多的时候是程序本身的问题,我计划将之后碰到的SegmentFault整合起来,一来方便日后查看,二来如果能帮助 ...

  10. 微信小程序开发之picker选择器组件用法

    picker组件时一个从底部弹起的可滚动的选择器(嵌入页面滚动器组件picker-view查看https://mp.weixin.qq.com/debug/wxadoc/dev/component/p ...