bzoj 1504 郁闷的出纳员
题目大意:
有一些员工 他们有工资 当他们的工资低于一个值时 他们会永远离开
支持以上四种操作 最后输出有多少个员工离开
思路:
几乎是splay裸题 对于A S操作维护一个变量即可
A S的时候find一下满足的最小值 转到根上 把左儿子扔掉
其他操作在剩下的树中搞即可
(那么多数据那么多询问 就错了一个 答案还差1)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2139062143
#define ll long long
#define MAXN 300100
#define MOD 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,mn,w,sum;char Ch[];
int ch[MAXN][],fa[MAXN],tot,cnt[MAXN],val[MAXN],sz[MAXN],rt;
inline int which(int x) {return ch[fa[x]][]==x;}
inline void upd(int x) {if(x) sz[x]=sz[ch[x][]]+cnt[x]+sz[ch[x][]];}
inline void rotate(int x)
{
int f=fa[x],z=fa[f],k=which(x);
ch[f][k]=ch[x][k^],fa[ch[f][k]]=f,fa[f]=x,ch[x][k^]=f,fa[x]=z;
if(z) ch[z][f==ch[z][]]=x;upd(f);upd(x);return ;
}
inline void splay(int x)
{
for(int f;f=fa[x];rotate(x))
if(fa[f]) rotate(which(x)==which(f)?f:x);
rt=x;
}
inline void insert(int x)
{
int pos=rt,f;
while()
{
if(val[pos]==x) {sum++,cnt[pos]++;splay(pos);return ;}
f=pos,pos=ch[pos][val[pos]<x];
if(!pos)
{
pos=++tot,val[pos]=x,cnt[pos]=sz[pos]=,fa[pos]=f,sum++;
ch[f][val[f]<x]=pos,ch[pos][]=ch[pos][]=;upd(f);
splay(pos);return ;
}
}
}
inline void Insert(int x)
{
if(!rt) {sum++,val[++tot]=x,ch[tot][]=ch[tot][]=fa[tot]=,cnt[tot]=sz[tot]=,rt=tot;return;}
insert(x);
}
inline void Find(int x)
{
int res=,pos=rt;
while()
{
if(!pos)
{
if(res) {splay(res);ch[res][]=,fa[ch[res][]]=;upd(rt);}
else rt=;return ;
}
if(x<val[pos]) res=pos,pos=ch[pos][];
else
{
if(val[pos]==x) {splay(pos);ch[pos][]=,fa[ch[pos][]]=;upd(rt);return ;}
pos=ch[pos][];
}
}
}
int find_rank(int x)
{
int tmp=,pos=rt;
if(x>sz[rt]) return -w-;
else x=sz[rt]-x+;
while()
if(ch[pos][]&&x<=sz[ch[pos][]]) pos=ch[pos][];
else
{
tmp=sz[ch[pos][]]+cnt[pos];
if(x<=tmp) return val[pos];
x-=tmp,pos=ch[pos][];
}
}
int main()
{
n=read(),mn=read();int a;
for(int i=;i<=n;i++)
{
scanf("%s",Ch);a=read();
if(Ch[]=='I') {if(a<mn) continue;Insert(a-w);}
else if(Ch[]=='F') printf("%d\n",find_rank(a)+w+(sz[rt]==&&((find_rank(a)+w)==)));
else {w+=(Ch[]=='S'?-:)*a;Find(mn-w);}
}
printf("%d\n",sum-sz[rt]);
}
(镘太巨了 原来我这个菜鸡没有upd sz)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2139062143
#define ll long long
#define MAXN 300100
#define MOD 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,mn,w,sum;char Ch[];
int ch[MAXN][],fa[MAXN],tot,cnt[MAXN],val[MAXN],sz[MAXN],rt;
inline int which(int x) {return ch[fa[x]][]==x;}
inline void upd(int x) {if(x) sz[x]=sz[ch[x][]]+cnt[x]+sz[ch[x][]];}
inline void rotate(int x)
{
int f=fa[x],z=fa[f],k=which(x);
ch[f][k]=ch[x][k^],fa[ch[f][k]]=f,fa[f]=x,ch[x][k^]=f,fa[x]=z;
if(z) ch[z][f==ch[z][]]=x;upd(f);upd(x);return ;
}
inline void splay(int x)
{
for(int f;f=fa[x];rotate(x))
if(fa[f]) rotate(which(x)==which(f)?f:x);
rt=x;
}
inline void insert(int x)
{
int pos=rt,f;
while()
{
if(val[pos]==x) {sum++,cnt[pos]++;upd(pos);splay(pos);return ;}
f=pos,pos=ch[pos][val[pos]<x];
if(!pos)
{
pos=++tot,val[pos]=x,cnt[pos]=sz[pos]=,fa[pos]=f,sum++;
ch[f][val[f]<x]=pos,ch[pos][]=ch[pos][]=;upd(f);
splay(pos);return ;
}
}
}
inline void Insert(int x)
{
if(!rt) {sum++,val[++tot]=x,ch[tot][]=ch[tot][]=fa[tot]=,cnt[tot]=sz[tot]=,rt=tot;return;}
insert(x);
}
inline void Find(int x)
{
int res=,pos=rt;
while()
{
if(!pos)
{
if(res) {splay(res);ch[res][]=,fa[ch[res][]]=;upd(rt);}
else rt=;return ;
}
if(x<val[pos]) res=pos,pos=ch[pos][];
else
{
if(val[pos]==x) {splay(pos);ch[pos][]=,fa[ch[pos][]]=;upd(rt);return ;}
pos=ch[pos][];
}
}
}
int find_rank(int x)
{
int tmp=,pos=rt;
if(x>sz[rt]) return -w-;
else x=sz[rt]-x+;
while()
if(ch[pos][]&&x<=sz[ch[pos][]]) pos=ch[pos][];
else
{
tmp=sz[ch[pos][]]+cnt[pos];
if(x<=tmp) return val[pos];
x-=tmp,pos=ch[pos][];
}
}
int main()
{
n=read(),mn=read();int a;
for(int i=;i<=n;i++)
{
scanf("%s",Ch);a=read();
if(Ch[]=='I') {if(a<mn) continue;Insert(a-w);}
else if(Ch[]=='F') printf("%d\n",find_rank(a)+w);
else {w+=(Ch[]=='S'?-:)*a;Find(mn-w);}
}
printf("%d\n",sum-sz[rt]);
}
bzoj 1504 郁闷的出纳员的更多相关文章
- [BZOJ 1503]郁闷的出纳员(fhq treap)
[BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...
- bzoj 1503郁闷的出纳员(splay)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 11759 Solved: 4163[Submit][Stat ...
- BZOJ 1503 郁闷的出纳员 (treap)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13370 Solved: 4808[Submit][Stat ...
- 洛谷 1486/BZOJ 1503 郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13866 Solved: 5069[Submit][Stat ...
- BZOJ 1503 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- BZOJ[NOI2004]郁闷的出纳员 | Splay板子题
题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...
- 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...
随机推荐
- Leetcode 319.灯泡开关
灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...
- [Go]GOPATH相关知识点
在成功安装好Go之后,执行命令 go env 就可以看到有关go的一些环境变量,其中比较关键的是GOROOT.GOPATH和 GOBIN 1.设置GOPATH环境变量有什么意义? GOPATH是指:指 ...
- captcha库报错"OSError: cannot open resource"
问题描述 在win平台上python虚拟环境下使用captcha库生成验证码报错OSError: cannot open resource 代码 from captcha.image import I ...
- BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
n<=100000个数表示每头牛在K<=30种物品的选取情况,该数在二进制下某位为0表示不选1表示选,求一个最大的区间使区间内选择每种物品的牛一样多. 数学转化,把不同状态间单变量的关系通 ...
- 文本框变更值触发js事件
//输入数量更新,不需要失去焦点才触发 $(document).on('input', "input[id^='itemquantity']", function () { sav ...
- Java数组操作方法收集(快速判断某个值在这个数组中)
Java数组操作最高效的方式是循环取值,如果转换成集合那么就会分配内存,效率不如前者,但是方法多,需要在性能调优上去权衡.切记:数组是数组,集合是集合. 下面是收集最常用的数组转成集合的操作方法: i ...
- openstack DVR的AIO 问题
问题描述 : 创建public 网络,创建路由器,并且把路由器的gateway 设置指向网络后有下面几种错误 路由器对应的linux network namespace 建立起来了,但是里面并没有对应 ...
- C# 读自己的资源文件
Assembly assm = this.GetType().Assembly;//Assembly.LoadFrom(程序集路径); foreach (string resName in assm. ...
- 我的Android Studio 优化之路
改动keymap 改动经常使用的快捷键 代码补全(Eclipse: ALT+/) Android Studio中默认用的是Ctrl+Space, 这跟输入法切换冲突.找到Keymap->Main ...
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...