1503. [NOI2004]郁闷的出纳员【平衡树-splay】
Description
Input
Output
Sample Input
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
Sample Output
20
-1
2
用一个delta来存当前工资修改成什么样了
A的话就delta+
S就delta-
F查询第k多就是查询第(人数-k+1)少
I就是Insert操作。
在每一个操作前,我们要先把低于下限的删掉
操作方法:插入(Min--delta-1),然后把根和左子树删掉
更新一下总人数和总离开人数
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN (300000)
using namespace std;
int Cnt[MAXN];
int Size[MAXN];
int Key[MAXN];
int Son[MAXN][];
int Father[MAXN];
int SIZE,ROOT; void Clear(int x)
{
Cnt[x]=Size[x]=Key[x]=Son[x][]=Son[x][]=Father[x]=;
} int Get(int x)
{
return Son[Father[x]][]==x;
} void Update(int x)
{
if (x)
{
Size[x]=Cnt[x];
if (Son[x][]) Size[x]+=Size[Son[x][]];
if (Son[x][]) Size[x]+=Size[Son[x][]];
}
} void Rotate(int x)
{
int fa=Father[x];
int fafa=Father[fa];
int wh=Get(x);
Son[fa][wh]=Son[x][wh^];
Father[fa]=x;
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Father[x]=fafa;
Son[x][wh^]=fa;
if (fafa) Son[fafa][Son[fafa][]==fa]=x;
Update(fa);
Update(x);
} void Splay(int x)
{
for (int fa;fa=Father[x];Rotate(x))
if (Father[fa])
Rotate(Get(fa)==Get(x)?fa:x);
ROOT=x;
} int Findx(int x)
{
int now=ROOT;
while ()
{
if (x<=Size[Son[now][]])
now=Son[now][];
else
{
x-=Size[Son[now][]];
if (x<=Cnt[now])
{
Splay(now);
return Key[now];
}
x-=Cnt[now];
now=Son[now][];
}
}
} void Insert(int x)
{
if (ROOT==)
{
ROOT=++SIZE;
Key[SIZE]=x;
Cnt[SIZE]=Size[SIZE]=;
return;
}
int now=ROOT,fa=;
while ()
{
if (Key[now]==x)
{
++Cnt[now];
Update(now);
Splay(now);
return;
}
fa=now;now=Son[now][x>Key[now]];
if (now==)
{
++SIZE;
Key[SIZE]=x;
Cnt[SIZE]=Size[SIZE]=;
Father[SIZE]=fa;
Son[fa][x>Key[fa]]=SIZE;
Update(fa);
Splay(SIZE);
return;
}
}
} int main()
{
int delta=,n,Min,x,Sum=,Ans=;
char p;
scanf("%d%d",&n,&Min);
for (int i=;i<=n;++i)
{
Insert(Min-delta-);
Sum-=Size[Son[ROOT][]]+Cnt[ROOT]-;
Ans+=Size[Son[ROOT][]]+Cnt[ROOT]-;
int Oldroot=ROOT;
Father[Son[ROOT][]]=;
ROOT=Son[ROOT][];
Clear(Oldroot);
scanf("\n%c%d",&p,&x);
if (p=='A')
delta+=x;
if (p=='S')
delta-=x;
if (p=='I' && x-delta>=Min-delta)
{
Insert(x-delta);
++Sum;
}
if (p=='F')
if (Sum>=x)
printf("%d\n",Findx(Sum-x+)+delta);
else
printf("-1\n");
}
printf("%d\n",Ans);
}
1503. [NOI2004]郁闷的出纳员【平衡树-splay】的更多相关文章
- 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
- 1503: [NOI2004]郁闷的出纳员 (SBT)
1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec Memory ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- (WA)BZOJ 1503: [NOI2004]郁闷的出纳员
二次联通门 : BZOJ 1503: [NOI2004]郁闷的出纳员 /* BZOJ 1503: [NOI2004]郁闷的出纳员 考虑这样一个事实 无论是加或减 都是针对全体人员的 那么只需要记录一个 ...
- bzoj 1503: [NOI2004]郁闷的出纳员 Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6263 Solved: 2190[Submit][Statu ...
- BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...
- Luogu P1486 [NOI2004]郁闷的出纳员(平衡树)
P1486 [NOI2004]郁闷的出纳员 题意 题目描述 \(OIER\)公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
随机推荐
- RESTful API的十个最佳实践
WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇. 通常我们使用RESTFul(Rep ...
- apache ftp server的简单入门(java应用内嵌ftp server)
Apache Ftp Server:(强调) Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能.Apache FtpServer ...
- 关于removeChild
var a=document.body; document.body.parentNode.removeChild(a) console.log(a); a的内容还是body???whY
- win7安装node.js
最新版本的node.js都已经集成了npm,所以直接从官网下载即可!(不用再配置环境变量) 官网:https://nodejs.org/download/release/latest/ 下载解压即安装 ...
- zabbix系列之三——安装报错
1Zabbix_server启动失败 1.1查看日志:vi /var/log/zabbix/zabbix_server.log zabbix_server [23500]: cannot open l ...
- CentOS6.4 下安装 MySql5.5.13
1.卸载系统自带的MySql 1.1.查看该操作系统上是否已经安装了mysql数据库 [root@xhTest-1 ~]# rpm -qa | grep mysql 1.2.删除原mysql数据库 1 ...
- Oracle EBS 应收发票取值
SELECT ct.trx_number ,ctl.description ,fnd_flex_ext.get_segs('SQLGL' ,'GL#' ,gcc.chart_of_accounts_i ...
- 关于easyUI一些标签的使用
①table: 1.class="easyui-datagrid":指定为easyUI的表格布局 2.pagination="true":带分页的表格 3.ro ...
- swift中,Optional、?与!之间的关系
swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...
- Python日志记录(logging)
import logging logfile = 'e:\\a.txt' # logging.basicConfig(filename=logfile,level=logging.INFO) # lo ...