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\)公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
随机推荐
- Spring学习手札(四)谈谈Spring Bean的生命周期及作用域
在Spring中,那些组成应用程序的主体以及由Spring IoC容器所管理的对象,被称之为Bean.Bean与应用程序中其他对象(比如自己创建类)的区别就是,Bean是由IoC容器创建于销毁的.在S ...
- whistle替代Fiddler调试远程服务器代码使用教程
前沿 之前在window下开发的同学大部分都是使用Fiddler代理工具做远程调试,自从换了Mac后也想找个代替工具调试,查询了下大概都比较推荐两款:Charles 和 Whistle .不过Char ...
- gulpjs的使用介绍及技巧
gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...
- flutter 生命周期
前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情, flutter中的State生命周期和android以及React Native的生命周期类似. 先看一 ...
- Android sdcard之read-only
AndroidManifest.xml是否加入了SDCard的权限设置 <!-- 创建与删除文件权限 --> <uses-permission android:name=" ...
- qemu模拟vexpress-a9及u-boot引导 linux
前言 本文讲述使用 qemu 来模拟 vexpress-a9 开发板 ,同时介绍使用 u-boot 引导 linux 的流程.整个坐下来对 qemu 和 u-boot 以及嵌入式 linux 的工作方 ...
- 4.使用bat调用可执行jar文件
一.项目需求 1.maven工程 2.有properties配置文件. 3.有内部jar包 二.简单的是实现实例 1.项目文件放置 注意:如果是web工程,我们会将jar文件当到我们项目WEB-INF ...
- deep learning深度学习之学习笔记基于吴恩达coursera课程
feature study within neural network 在regression问题中,根据房子的size, #bedrooms原始特征可能演算出family size(可住家庭大小), ...
- OSCache-缓存对象
在实际应用中除了JSP标签库,还可以使用OSCache提供的Java API.下面我来介绍一个实用的Java类,使用GeneralCacheAdministrator来建立,刷新和管理缓存. Gene ...
- 使用 sar 和 kSar 来发现 Linux 性能瓶颈
作者: Vivek Gite 译者: LCTT qhwdw | sar 命令用用收集.报告.或者保存 UNIX / Linux 系统的活动信息.它保存选择的计数器到操作系统的 /var/log/sa/ ...