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. android学习3——长宽的单位问题dp,px,dpi

    android设备的单位px,pt,dp,sp 分辨率 先通俗说下分辨率的概念.可以把屏幕想想成一个个正方形格子组成的.如果横向有1280个格子,竖向有720个格子.那么分辨率就是1280*720.这 ...

  3. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  4. JDBC链接mysql数据库

    Unit_1 首先:JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系是接口与实现的关系. JDBC涉及到四个核心的 ...

  5. 第21篇 js四种继承方式

    js是一个很自由的语言,没有强类型的语言的那种限制,实现一个功能往往有很多做法.继承就是其中的一个,在js中继承大概可以分为四大类,上面一篇文章也提及过一些,下面开始详细说说js的继承. 1.原型继承 ...

  6. 最近新版本的pangolin出现了点问题,我把可用的旧版本上传到了github

    经测试该版本编译没有问题. 下载地址:https://github.com/zzx2GH/Pangolin.git

  7. JavaScript设计模式之构造器、模块和原型

    JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...

  8. JS判断手机当前的系统类型

    <script language="javascript"> window.onload = function () { var n = navigator.userA ...

  9. tp框架基础知识

    作者:黄力军 index.php入口文件:作用,所有tp框架里的内容要想访问文件.都要走index.php文件他是整个程序的入口 Application代表应用程序的目录   所有写的应用程序放这里 ...

  10. java算法 蓝桥杯(题+答案) 方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...