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

Output
输出文件的行数为F命令的条数加一。对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。输出文件的最后一行包含一个整数,为离开公司的员工的总数。
Sample Input
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
Sample Output
20
-1
2
#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 郁闷的出纳员的更多相关文章
- 数据结构(跳跃表):NOI 2004 郁闷的出纳员
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- NOI 2004 郁闷的出纳员(平衡树)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- 【NOI】2004 郁闷的出纳员
[算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...
- c++之路进阶——codevs1286(郁闷的出纳员)
1286 郁闷的出纳员 2004年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description OIER公司 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
随机推荐
- adb devices找不到设备解决办法
问题现象: 解决办法: 1.在设备管理器Android Device中找到设备硬件Id USB\VID对应值: 3.找到.android目录,找到adb_usb.ini文件,如果没有此文件则新建一个, ...
- JMeter获取JSON内容
source("D:\\apache-jmeter-3.0\\用例\\Test.java"); public static void f(){ String response_da ...
- 【python】函数filter、map
- JavaScript循环实例
几个经典的循环案例: 1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 var i=0; var h=0.0001; while(true){ i++; h=h*2; ...
- iOS tableViewCell 在自定义高度方法中遇到的问题,cell高度为0,cell显示不出来,cell直接显示第几个而不是...cell显示个数不对
遇到以上问题可以看看你的cell高度中是否有,自定的高度,有了继续看,没有了继续百度... 在文字排版中,少不了自适应文字高度,行间距什么的:显然cell的高度时不固定的,如果复用自定义的cell的话 ...
- 第四节:dingo/API 最新版 V2.0 之 Responses (连载)
因为某些某些原因,不能按时更新,唉.我会尽力,加快速度.(这句话不是翻译的哈) 原文地址--> https://github.com/dingo/api/wiki/Responses A fun ...
- java中可变长参数
** * Created by Lenovo on 2017/12/10. * java中可变长参数 */ public class reflect04 { //m1有一个int类型的可比变长参数 / ...
- Ajax 的用法
1.什么是 Ajax? Ajax,英文名 Asynchronous JavaScript and XML,也就是异步的 JavaScript 和 XML.它不是一门新的语言,而是一种使用现有标准的新方 ...
- C#窗口传值(CSDN实例)
//非模式窗体 相较独立From qform=new Form(); qform.Show(); //模式窗体 子依赖父Form qform=new Form();qform.Show ...
- [js高手之路]原型式继承与寄生式继承
一.原型式继承本质其实就是个浅拷贝,以一个对象为模板复制出新的对象 function object( o ){ var G = function(){}; G.prototype = o; retur ...