[NOI2004]郁闷的出纳员

题目链接

题目描述

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

平衡树的裸题,这里使用了替罪羊树,突然发现之前打的板子是个假的,在重构的时候只判断了子树的重构,没有判断整棵树的重构。

#include<bits/stdc++.h>
#define il inline
using namespace std;
int read()
{
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
const int N=210010;
double alpha=0.75;
int n,ming,cnt,lazy,root,need,top,x,num;char qwe[5];
int s[N];
struct node{
int son[2],v,size,die;
}tree[N];
int exist(int k){return (tree[k].die^1);}
il bool bad(int k)
{
int k1=tree[k].son[0],k2=tree[k].son[1];
return (double)max(tree[k1].size,tree[k2].size)>=(double)tree[k].size*1.0*alpha;
}
il void push_up(int k)
{
tree[k].size=tree[tree[k].son[0]].size+tree[tree[k].son[1]].size+exist(k);
}
il void dfs(int k)
{
if(!k) return;
dfs(tree[k].son[0]);if(!tree[k].die)s[++top]=k;dfs(tree[k].son[1]);
}
il void build(int &k,int l,int r)
{
if(l>r) return;int mid=(l+r)/2;k=s[mid];
if(l==r)
{
tree[k].son[0]=tree[k].son[1]=tree[k].die=0;
tree[k].size=1;return;
}
if(l<mid) build(tree[k].son[0],l,mid-1);
else tree[k].son[0]=0;
if(r>mid) build(tree[k].son[1],mid+1,r);
else tree[k].son[1]=0;
int k1=tree[k].son[0],k2=tree[k].son[1];
tree[k].size=tree[k1].size+tree[k2].size+1;
}
il void rebuild(int &k)
{
top=0;dfs(k);if(top)build(k,1,top);else k=0;
}
il void insert(int &k,int v)
{
if(!k)
{
k=++cnt;tree[k].v=v;tree[k].size=1;tree[k].die=0;return;
}
tree[k].size++;
if(v<=tree[k].v) insert(tree[k].son[0],v);
else insert(tree[k].son[1],v);
if(!bad(k))
{
if(need)
{
if(tree[k].son[0]==need) rebuild(tree[k].son[0]);
else rebuild(tree[k].son[1]);
}
need=0;
}
else need=k;
}
il void delet(int k,int v)
{
if(!k) return;
int k1=tree[k].son[0],k2=tree[k].son[1];
if(!tree[k].die&&tree[k1].size+1==v)
{
tree[k].die=1;tree[k].size=tree[k2].size;tree[k].son[0]=0;num+=tree[k1].size+1;return;
}
if(tree[k1].size+exist(k)>=v) delet(k1,v);
else
{
delet(k2,v-tree[k1].size-exist(k));tree[k].son[0]=0;num+=tree[k1].size+exist(k);tree[k].die=1;
}
push_up(k);
if(!bad(k))
{
if(need)
{
if(tree[k].son[0]==need) rebuild(tree[k].son[0]);
else rebuild(tree[k].son[1]);
}
need=0;
}
else need=k;
}
il int getrank(int k,int v)
{
if(!k) return 0;
int k1=tree[k].son[0],k2=tree[k].son[1];
if(tree[k].v<v) return getrank(k2,v)+tree[k1].size+exist(k);
return getrank(k1,v);
}
il int kth(int k,int v)
{
if(!k) return -1;
int k1=tree[k].son[0],k2=tree[k].son[1];
if(!tree[k].die&&tree[k2].size+1==v) return tree[k].v+lazy;
if(tree[k2].size>=v) return kth(k2,v);
return kth(k1,v-tree[k2].size-exist(k));
}
int main()
{
n=read();ming=read();
for(int i=1;i<=n;i++)
{
scanf("%s",qwe);x=read();
if(qwe[0]=='I') {if(x>=ming)insert(root,x-lazy);if(need)rebuild(root),need=0;}
else if(qwe[0]=='A') lazy+=x;
else if(qwe[0]=='S')
{
lazy-=x;
int d=getrank(root,ming-lazy);
if(d!=0)delet(root,d);if(need)rebuild(root),need=0;
}
else if(qwe[0]=='F') printf("%d\n",kth(root,x));
}
cout<<num<<endl;
return 0;
}

[NOI2004]郁闷的出纳员(平衡树)的更多相关文章

  1. Luogu P1486 [NOI2004]郁闷的出纳员(平衡树)

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

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

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

  3. [BZOJ1503][NOI2004]郁闷的出纳员

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

  4. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  5. 【bzoj1503】[NOI2004]郁闷的出纳员

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

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

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

  7. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Statu ...

  8. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

  9. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

随机推荐

  1. Twice Equation

    题目链接:https://nanti.jisuanke.com/t/A1541 题意:给你一个L,要你求一个不小于L的最小数字n,对于一个整数m,满足2*(m+1)*m=n*(n+1). 思路:打表找 ...

  2. 最简单的flask项目详解

    # 第一部分,初始化:所有的Flask都必须创建程序实例, # web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 # 程序实例是Flask的对象,一般情况下用如下方法实例化 # F ...

  3. RabbitMQ + Springboot +“Hello Word”

    https://www.rabbitmq.com/getstarted.html 官网文档 我们将呼叫我们的消息发布者(发送者)发送和我们的消息消费者(接收者) Recv.发布者将连接到RabbitM ...

  4. Cannot read property 'type' of undefined ....

    一直解决不了,弄了半天是 jquery 版本太低,换一个版本就ok.

  5. 二十五、python中pickle序列学习(仅python语言中有)

    1.pickle序列介绍:提供4个关键字:dumps,dump,loads,load 语法:f.write(pickle.dumps(dict))=pickle.dump(dict,f) " ...

  6. 十四、python字典中的方法汇总

    '''1.访问.修改,删除字典中的值:''' dict={'a':'11','b':'22','c':'33','d':'44'}print dict['a'],dict['d'] #访问dict[' ...

  7. vscode-常用插件介绍(10大插件)

    https://www.cnblogs.com/zhaoshujie/p/9834654.html 本文介绍了目前前端开发最受欢迎的开发工具 VSCode 必装的 10 个开发插件,用于大大提高软件开 ...

  8. python写一个查询接口

    知识点: 1.flask_sqlalchemy查询: Flask-SQLAlchemy 在您的 Model 类上提供了 query 属性.当您访问它时,您会得到一个新的所有记录的查询对象.在使用 al ...

  9. OpenStack 多节点纳管 vCenter 5.5

    目录 目录 测试环境 Nova 配置OpenStack 纳管 vCenter 虚拟机 Glance 配置OpenStack 纳管 vCenter 镜像 Cinder 配置OpenStack 纳管 vC ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第1节 异常_1_异常概念&异常体系

    Throwable是可抛出的意思.