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\)公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
随机推荐
- css3 transition(转换)笔记
之前transition也用过,大都是ctrl+c,然后ctrl+v,没有了解太详细,这次对transition的应用源自侧边抽屉展开收起的动画效果需要. W3C标准中对css3的transition ...
- AngleSharp一些示例
看到了AngleSharp,感觉这个非常好用,比HtmlAgilityPack感觉好用点 AngleSharp 地址:https://github.com/AngleSharp/AngleSharp ...
- 从一个带有http://网络文件中获取文件名
例如文件网址为: http://a.hiphotos.baidu.com/image/h%3D200/sign=c3da85e50123dd543e73a068e108b3df/80cb39dbb6f ...
- 深入理解java虚拟机---4虚拟机类加载机制
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结
Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结 这两天闲着没事想利用**Spring Boot**加上阿里的开源数据连接池**Druid* ...
- java的文件操作(1)
package com.test.file; import java.io.*; import java.util.ArrayList; import java.util.Date; import j ...
- Ubuntu双系统环境下隐藏掉其他开机启动项
系统环境:ubuntu16.04需求:PC装的双系统(ubuntu+win10),为了应对某些需求,需要将win10系统给从电脑上消失,让你看不见也进不去它.做法:当然不可能真的删除掉win10系统, ...
- Web前端的状态管理
背景 我相信很多朋友跟我一样,初次听到什么 Flux , Redux , Vuex , 状态管理 的时候是一脸懵逼的.因为在外面之前前端大部分开发的时候,根本没有那么多的概念.自从ReactJS火 ...
- Android实战——GreenDao3.2的使用,爱不释手
1前言 GreenDao是一款操作数据库的神器,经过了2.0版本的升级后,已经被广泛的开发者使用.确实是很好用,入门简单,可以剩去了数据库的建表操作和数据库SQL的编写,博主用了一次之后爱不释手,和以 ...
- Pwn with File结构体(四)
前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...