题目描述

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

题解:先讲讲做法

假设你会splay,然后就变的很简单了

我们记录一个now为现在被减去了多少(正减负加)

显然插入操作是往splay中插入vx+now

a只需要将now减掉val

s将now加val并且将值小于min+now的所有点删掉

具体做法是找到min+now的前驱的后继,将它splay到根,将它的左子树置为0

f找到第k大,并输出val-now

以下是菜鸡的写题心路历程

没错,这题我写了一天。

最初的时候的确是写错了第k大部分,然后我问czl linux有没有sleep

czl表示没有

然后我说这个简单啊,我在里面加个超级大的for循环不就行了吗?

接着我很快就调出了k大哪里写萎了,过了样例我就交了。

结果只过了1个点,其他点都T飞

调了一个下午,突然发现,嗯?这里怎么会有个for循环???

删掉,过了。。。。。。

我到底是有多菜啊qwq

代码如下:

#include<cmath>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lson ch[x][0]
#define rson ch[x][1]
#define hi puts("hi!");
using namespace std; int f[],ch[][],key[],cnt[],size[],pos,rt,sz,now,tot,m,min1,val,ans; int push_up(int x)
{
size[x]=size[lson]+size[rson]+cnt[x];
} int rotate(int x)
{
int y=f[x],z=f[y],kd=ch[y][]==x,xs=ch[x][!kd];
if(z) ch[z][ch[z][]==y]=x;
ch[y][kd]=xs;
ch[x][!kd]=y;
if(xs) f[xs]=y;
f[x]=z;
f[y]=x;
push_up(y);
} int splay(int x,int goal)
{
int y,z;
while(f[x]!=goal)
{
y=f[x],z=f[y];
if(z!=goal) (ch[z][]==y)^(ch[y][]==x)?rotate(x):rotate(y);
rotate(x);
}
push_up(x);
if(!goal) rt=x;
} int find(int x)
{
pos=rt;
while(key[pos]!=x)
{
if(key[pos]>x)
{
if(ch[pos][]) pos=ch[pos][];
else break;
}
else
{
if(ch[pos][]) pos=ch[pos][];
else break;
}
}
} int insert(int x)
{
find(x);
if(key[pos]==x) cnt[pos]++,size[pos]++;
else
{
cnt[++sz]=,key[sz]=x,size[sz]=;
if(key[pos]>x) f[sz]=pos,ch[pos][]=pos?sz:,pos=sz;
else f[sz]=pos,ch[pos][]=pos?sz:,pos=sz;
}
splay(pos,);
} int get(int x,int kd)
{
find(x);
if(kd&&key[pos]>x) return ;
if((!kd)&&key[pos]<x) return ;
splay(pos,);
pos=ch[pos][kd];
while(ch[pos][!kd]) pos=ch[pos][!kd];
return ;
} int del()
{
int sum=min1+now;
get(sum,);
get(key[pos],);
splay(pos,);
ans+=size[ch[pos][]]-;
ch[pos][]=;
push_up(pos);
} int kth(int k)
{
pos=rt;
while(size[ch[pos][]]>=k||size[ch[pos][]]+cnt[pos]<k)
{
if(size[ch[pos][]]>=k&&ch[pos][]) pos=ch[pos][];
else if(k>size[ch[pos][]]+cnt[pos]&&ch[pos][]) k-=cnt[pos]+size[ch[pos][]],pos=ch[pos][];
}
} int print(int x)
{
if(lson) print(lson);
if(rson) print(rson);
printf("%d %d %d\n",key[x],key[lson],key[rson]);
} char op[]; int main()
{
insert(-1e9);
insert(1e9);
scanf("%d%d",&m,&min1);
int tmpp=m;
while(m--)
{
scanf("%s%d",op,&val);
if(op[]=='I') if(val>=min1) insert(val+now);
if(op[]=='A') now-=val;
if(op[]=='S') now+=val,del(),insert(-1e9);
if(op[]=='F')
{
if(val>size[rt]-) puts("-1");
else kth(size[rt]-val),printf("%d\n",key[pos]-now);
}
}
printf("%d\n",ans);
}

洛谷P1486 [NOI2004]郁闷的出纳员(splay)的更多相关文章

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

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

  2. 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]

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

  3. 洛谷 P1486 [NOI2004]郁闷的出纳员

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

  4. 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码

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

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

    Code: #include<cstdio> #include<algorithm> using namespace std; struct Node{ int s,val,t ...

  6. 【洛谷P1486】郁闷的出纳员

    题目大意:维护一个平衡树,支持插入一个数,删除小于一个值的所有数,K 大值查询,每个节点权值加减一个数. 题解:所有节点权值加减操作可以考虑直接维护一个全局标记,删除小于一个值的所有数字为一个二分的过 ...

  7. P1486 [NOI2004]郁闷的出纳员

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

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

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

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

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

随机推荐

  1. ASP/ASP.NET/VB6文件上传

    1. asp asp 上传文件真的蛋疼,很麻烦,有时候就用第三方组件,或者比较复杂的写法来实现无组件上传. 测试OK的一个叫风声无组件上传类 V2.1 [Fonshen UpLoadClass Ver ...

  2. 【路由达人】简单两步搞定小米路由新增功能-DDNS(解析域名地址转向在线工具)

    DDNS(Dynamic Domain Name Server)是动态域名服务的缩写! 简单来说目前ISP大多为我们提供动态IP(如ADSL拨号上网),而很多设备或服务需要通过远程访问时需要一个固定的 ...

  3. sql 如何更改表的字段属性

    alter table tablename alter column colname newDataType 比如:ALTER   TABLE   mytable ALTER COLUMN  myco ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #11cpuset

    HACK #11cpuset 本节介绍控制物理CPU分配的cpuset.cpuset是Linux控制组(Cgroup)之一,其功能是指定特定进程或线程所使用的CPU组.另外,除CPU以外,同样还能指定 ...

  5. OpenCL Hello World

    ▶ OpenCL 的环境配置与第一个程序 ● CUDA 中自带 OpenCL 需要的头文件和库,直接拉近项目里边去就行:AMD 需要下载 AMD APP SDK(https://community.a ...

  6. 「小程序JAVA实战」小程序的留言和评价功能(70)

    转自:https://idig8.com/2018/10/28/xiaochengxujavashizhanxiaochengxudeliuyanhepingjiagongneng69/ 目前小程序这 ...

  7. eclipse liquibase 插件

    http://marketplace.eclipse.org/category/free-tagging/liquibase http://marketplace.eclipse.org/market ...

  8. SystemColors 成员

    名称 说明 ActiveBorder 获取 Color 结构,它是活动窗口边框的颜色. ActiveCaption 获取 Color 结构,它是活动窗口标题栏的背景色. ActiveCaptionTe ...

  9. How to run eclipse in clean mode? and what happens if we do so?

    What it does: if set to "true", any cached data used by the OSGi framework and eclipse run ...

  10. Ubuntu12.04编译vlc-android详细流程

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...