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. Webpack学习系列(二)

    一: 安装: npm install webpack-dev-server -g npm install webpack-dev-server --save (下载到当前文件夹) npm instal ...

  2. 【2017年新篇章】 .NET 面试题汇总(二)

    本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...

  3. Dijkstra算法——单源最短路径问题

    学习一个点到其余各个顶点的最短路径--单源最短路径 Dijkstra算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向 ...

  4. FineUIMvc随笔 - 动态创建表格列

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户需求 用户希望实现动态创建表格列,在 WebForms 中,我们通过在 Page_Init 中创建列来实现: 但是在 MVC ...

  5. 使用 Bitbucket Pipelines 持续交付托管项目

    简介 Bitbucket Pipelines 是Atlassian公司为Bitbucket Cloud产品添加的一个新功能, 它为托管在Bitbucket上的项目提供了一个良好的持续集成/交付的服务. ...

  6. 每天一个Linux命令(07)--mv命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名,这也是个常用命令,经常用来备份文件或者目录. 1.命令格式: mv  [选项] 源文件或目录  目标文件或目录 2.命令功能: 视mv命令中第 ...

  7. Java 集合的简单实现 (ArrayList & LinkedList & Queue & Stack)

    ArrayList 就是数组实现的啦,没什么好说的,如果数组不够了就扩容到原来的1.5倍 实现了迭代器 package com.wenr.collection; import java.io.Seri ...

  8. Maven进阶宝典

    前言: 团队在开发过程中用的是maven项目,由于对maven的一些打包流程以及相关参数配置不是太了解,因此应大家的需求做一下maven的讲解,为了不误导大家,看了很多相关资料,自己也实验了一下,就把 ...

  9. redux-form的学习笔记二--实现表单的同步验证

    (注:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/ 在这篇博客里,我将用redux-f ...

  10. 很污的机器学习:从xhamster网站找到喜欢的片子

    前言 最近迷上了看黄片(大雾).每次总是去搜索想看的片子,什么asian porn anal pussy 什么的我都不知道. 搜索着搜索着我手也累了,而且我喜欢的片子也是有一定的特征的,我不想把所有的 ...