P1486 郁闷的出纳员

题目描述

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。

工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。

老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。

好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?

如果某个员工的初始工资低于最低工资标准,那么将不计入最后的答案内

输入输出格式

输入格式:

第一行有两个非负整数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是一个正整数。

在初始时,可以认为公司里一个员工也没有。

输出格式:

输出文件的行数为F命令的条数加一。

对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,如果k大于目前员工的数目,则输出-1。

输出文件的最后一行包含一个整数,为离开公司的员工的总数。

输入输出样例

输入样例#1:

9 10
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
输出样例#1:

10
20
-1
2

说明

I命令的条数不超过100000

A命令和S命令的总条数不超过100

F命令的条数不超过100000

每次工资调整的调整量不超过1000

新员工的工资不超过100000

模版题,唯一的创新就是用一个cal记录加工资与扣工资,加t元就cal-=t。扣工资时就先处理好cal再把cal插到BST里面,旋转到根,看他左侧子树大小,然后把左子树删掉。

不过有可能中间的时候公司里没有人,这是再插入人就要重新建树了。

 #include<cstdio>
 #include<iostream>
 #include<string>
 using namespace std;
 ;
 ,sz=,cnt=;
 inline void update(int x)
 {
     size[x]=num[x];
     if(lch[x]) size[x]+=size[lch[x]];
     if(rch[x]) size[x]+=size[rch[x]];
 }
 inline void zig(int x)
 {
     int f=F[x],gf=F[f];
     F[f]=x;
     F[x]=gf;
     if(gf)
     {
         if(lch[gf]==f) lch[gf]=x;
         else if(rch[gf]==f) rch[gf]=x;
     }
     lch[f]=rch[x];
     F[rch[x]]=f;
     rch[x]=f;
     update(f);
     update(x);
 }
 inline void zag(int x)
 {
     int f=F[x],gf=F[f];
     F[f]=x;
     F[x]=gf;
     if(gf)
     {
         if(lch[gf]==f) lch[gf]=x;
         else if(rch[gf]==f) rch[gf]=x;
     }
     rch[f]=lch[x];
     F[lch[x]]=f;
     lch[x]=f;
     update(f);
     update(x);
 }
 inline void splay(int x)
 {
     int f,gf;
     )
     {
         f=F[x];
         gf=F[f];
         )
         {
             if(x==lch[f]) zig(x);
             else if(x==rch[f]) zag(x);
             break;
         }
         if(f==lch[gf]&&x==lch[f]) {zig(f);zig(x);}
         else if(f==rch[gf]&&x==rch[f]) {zag(f);zag(x);}
         else if(f==rch[gf]&&x==lch[f]) {zig(x);zag(x);}
         else {zag(x);zig(x);}
     }
     root=x;
 }
 inline int find(int x)
 {
     int p=root;
     while(key[p]!=x)
     {
         if(key[p]>x)
         {
             if(lch[p]) p=lch[p];
             else break;
         }
         if(key[p]<x)
         {
             if(rch[p]) p=rch[p];
             else break;
         }
     }
     return p;
 }
 inline void ins(int x)
 {
     )
     {
         key[++sz]=x;
         size[sz]=;
         num[sz]=;
         root=sz;
         F[sz]=;
         return;
     }
     int p=find(x);
     if(key[p]!=x)
     {
         key[++sz]=x;
         num[sz]=;
         F[sz]=p;
         if(x<key[p]) lch[p]=sz;
         else rch[p]=sz;
         lch[sz]=rch[sz]=;
         p=sz;
     }
     num[p]++;
     update(p);
     update(F[p]);
     splay(p);
 }
 inline void del()
 {
     int old=root;
     lch[old]=;
     num[old]--;
     )
     {
         F[rch[old]]=;
         root=rch[old];
     }
     update(root);
 }
 inline int findn(int x,int p)
 {
     int sr=size[rch[p]];
     if(x<=sr) return findn(x,rch[p]);
     else if(sr<x&&x<=sr+num[p]) return key[p];
     else return findn(x-sr-num[p],lch[p]);
 }
 int main()
 {
     int n,m,t,Min,cal;
     char c;
     scanf("%d%d",&n,&Min);
     cal=cnt=;
     ;i<=n;i++)
     {
         scanf("\n%c%d",&c,&t);
         if(c=='I'&&t>=Min) ins(t+cal);
         else if(c=='A') cal-=t;
         else if(c=='S')
         {
             cal+=t;
             ins(cal+Min);
             cnt+=size[lch[root]];
             del();
         }
         else if(c=='F')
         {
             if(size[root]<t) printf("-1\n");
             else printf("%d\n",(findn(t,root)-cal));
         }
     }
     printf("%d\n",cnt);
     ;
 }

Luogu1486郁闷的出纳员【Splay】的更多相关文章

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

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

  2. NOI2004 郁闷的出纳员 Splay

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

  3. bzoj 1503郁闷的出纳员(splay)

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

  4. 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

    splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...

  5. 洛谷P1486 [NOI2004]郁闷的出纳员(splay)

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

  6. 【NOI2004】郁闷的出纳员 - Splay

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

  7. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

  8. 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)

    题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...

  9. bzoj1503[NOI2004]郁闷的出纳员——Splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...

随机推荐

  1. C++STL笔记

    C++STL 1.vector 向量,长度可变的数组 头文件 #include<vector> 1.1vector的定义 vector<typename> name; 例如: ...

  2. Java之路——名词解释(一)

    一.开篇 许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀.看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云.尝试去查一下这些名词的解释,除了非常学术性的解释之 ...

  3. 我的Java开发之路

    拉拉溜溜学习了半年了.才发现自己现在才进入面向对象.

  4. python爬虫利器Selenium使用详解

    简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...

  5. 每天一个Linux命令(20)--find命令之exec

    find 是我们很常用的一个Linux命令,但是我们一般查找出来的额并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是 comm ...

  6. 每天一个Linux命令(06)--rmdir命令

    终于忙完了公司的事,可以安静的充充电了. 今天学习一下Linux中命令:rmdir 命令,rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm -r dir 命 ...

  7. 一个基于Behave框架的http接口测试实例

    前言:本人没怎么做过http接口测试,只是最近学习了一下,Behave框架也是最近学习的,如果有不对的请各位大神指点,感谢! 1.1       接口准备 本次get请求的接口用的是百度接口:wd=搜 ...

  8. Sass使用小技巧

    1.任何可以用作css属性值的赋值都可以用作sass变量值.如果变量值与属性不匹配,sass会当作普通字符串来处理. $family: "microsoft yahei", Ari ...

  9. Linux 安装DenyHost防止ssh被暴力破解

    DenyHosts介绍 当你的linux服务器暴露在外网当中时,服务器就极有可能会遭到互联网上的扫描软件进行扫描,然后试图连接ssh端口进行暴力破解(穷举扫描).如果遇到这个问题,一款非常有用的工具D ...

  10. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...