【BZOJ 1503】[NOI2004]郁闷的出纳员
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
因为所有人工资同时递减。
所以可以设置一个变化值delta.
然后每个人的初始值为k
则把k-delta加入伸展树中。
会发现delta变化之后。
伸展树中每个人的工资就仍然是原先的值+delta
比如
I 2000
delta = 100
则会插入一个1900到伸展树中。
然后delta的值可能会发生变化。
但会发现1900+delta会总是和这个人的当前工资相同
(并且对于每个人都是如此
那么我们只要把min-delta插入到伸展树种。
则比他小的数字都是要离开的人
(把这个min-delta移动到根节点。
然后把它的左子树大小累加一下就好
至于找第k大。
则也是伸展树能够完成的事情。
x-delta插入
以及delta改变之后
x+delta始终是每个人的真实工资这一点很关键。
(很棒的ideal
【代码】
#include <cstdio>
#define which(x) (ch[fa[x]][1]==x)
using namespace std;
int n,mi,delta;
const int N = 1e5 + 200;
int m,fa[N], tot, ch[N][2], root, x, siz[N],value[N];
void push_up(int x)
{
siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
}
int Rank(int x, int k)
{
if (siz[ch[x][0]] >= k)
return Rank(ch[x][0], k);
else
if (k == siz[ch[x][0]] + 1)
return x;
else
return Rank(ch[x][1], k - siz[ch[x][0]] - 1);
}
void Rotate(int x)
{
int f = fa[x];
bool k = which(x);
ch[f][k] = ch[x][!k];
ch[x][!k] = f;
ch[fa[f]][which(f)] = x;
fa[ch[f][k]] = f;
fa[x] = fa[f];
fa[f] = x;
siz[x] = siz[f];
push_up(f);
}
void Splay(int x, int g)
{
while (fa[x] != g)
{
int f = fa[x];
if (fa[f] == g)
{
Rotate(x);
break;
}
if (which(x) ^ which(f))
Rotate(x);
else
Rotate(f);
Rotate(x);
}
if (!g) root = x;
}
void cr(int x,int num)
{
if (!x){
root = ++tot;
siz[tot] = 1;
value[tot] = num;
return;
}
if (ch[x][num>value[x]]==0){
ch[x][num>value[x]] = ++tot;
value[tot] = num;
fa[tot] = x;
siz[tot] = 1;
}else
cr(ch[x][num>value[x]],num);
push_up(x);
}
int main()
{
//freopen("D:\\rush.txt","r",stdin);
long long ans = 0;
scanf("%d%d",&n,&mi);
for (int i = 1;i <= n;i++){
int k;
char s[5];
scanf("%s",s);
if (s[0]=='I'){
scanf("%d",&k);
if (k<mi) continue;
cr(root,k-delta);
Splay(tot,0);
}else if (s[0]=='A'){
scanf("%d",&k);
delta+=k;
}else if (s[0]=='S'){
scanf("%d",&k);
delta-=k;
cr(root,mi-delta);
Splay(tot,0);
ans+=siz[ch[tot][0]];
root = ch[tot][1];
fa[root] = 0;
}else if (s[0]=='F'){
scanf("%d",&k);
if (k>siz[root]){
printf("%d\n",-1);
}else{
int x = Rank(root,siz[root]-k+1);
Splay(x,0);
printf("%d\n",value[x]+delta);
}
}
}
printf("%lld\n",ans);
return 0;
}
【BZOJ 1503】[NOI2004]郁闷的出纳员的更多相关文章
- (WA)BZOJ 1503: [NOI2004]郁闷的出纳员
二次联通门 : BZOJ 1503: [NOI2004]郁闷的出纳员 /* BZOJ 1503: [NOI2004]郁闷的出纳员 考虑这样一个事实 无论是加或减 都是针对全体人员的 那么只需要记录一个 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 10526 Solved: 3685[Submit][Stat ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- bzoj 1503: [NOI2004]郁闷的出纳员 Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6263 Solved: 2190[Submit][Statu ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- 1503: [NOI2004]郁闷的出纳员 (SBT)
1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec Memory ...
- bzoj 3224 NOI2004郁闷的出纳员
NOI2004郁闷的出纳员 2013年12月26日6,1818 输入描述 Input Description 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行 ...
- 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...
- 1503. [NOI2004]郁闷的出纳员【平衡树-splay】
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
- 1503: [NOI2004]郁闷的出纳员
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13723 Solved: 4989[Submit][Status][Discuss] Descripti ...
随机推荐
- 实战:vue项目中导入swiper插件
版本选择 swiper是个常用的插件,现在已经迭代到了第四代:swiper4.常用的版本是swiper3和swiper4,我选择的是swiper3. 安装 安装swiper3的最新版本3.4.2: n ...
- [WPF,XAML] 跳动的心
原文:[WPF,XAML] 跳动的心 没什么艺术细胞,原谅,原谅! <Canvas Width="0" Height="0"> <Canvas ...
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 1.什么是Set?(what) Set是Collection容器的一个子接口,它不允许出现 ...
- ajax 获取 json 数据乱码
打开json文本把json文件另存为 'utf-8' 编码格式的文件.....
- ASP.NET-前台view返回model集合
有时操作列表的时候想一次提交一个model集合,这样后台controller直接接受后就可以直接进行操作了,不用使用js,比较方便,也体现了MVC的Binding模式的优势,方法如下: 准备: 1.两 ...
- HDU 4035
dp求期望的题. 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 叶子结点: E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i] ...
- Struts(19)Struts集成
Struts2 MVC架构 模型视图控制器(Model View Controller)或MVC,MVC是俗称.是一种软件设计模式,用于开发Web应用程序.模型 - 视图 - 控制器模式是由下面三个部 ...
- Java线程演示样例 - 继承Thread类和实现Runnable接口
进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...
- 51nod 1066 - Bash游戏,简单博弈
有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得比赛. 例如N = 3 ...
- [转] CentOS 7 为firewalld添加开放端口及相关资料
转自http://www.cnblogs.com/hubing/p/6058932.html 1.运行.停止.禁用firewalld 启动:# systemctl start firewalld 查 ...