题目大意:

有一些员工 他们有工资 当他们的工资低于一个值时 他们会永远离开

I命令 I_k 新建一个工资档案,初始工资为k。
                如果某员工的初始工资低于工资下界,他将立刻离开公司。
A命令 A_k 把每位员工的工资加上k
S命令 S_k 把每位员工的工资扣除k
F命令 F_k 查询第k多的工资

支持以上四种操作 最后输出有多少个员工离开

思路:

几乎是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 郁闷的出纳员的更多相关文章

  1. [BZOJ 1503]郁闷的出纳员(fhq treap)

    [BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...

  2. bzoj 1503郁闷的出纳员(splay)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 11759  Solved: 4163[Submit][Stat ...

  3. BZOJ 1503 郁闷的出纳员 (treap)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13370  Solved: 4808[Submit][Stat ...

  4. 洛谷 1486/BZOJ 1503 郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13866  Solved: 5069[Submit][Stat ...

  5. BZOJ 1503 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  6. BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...

  7. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  8. BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

    题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...

  9. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员

    Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...

随机推荐

  1. POJ3041:Asteroids【二分图匹配】

    二分图的最大匹配=最小顶点覆盖(Konig定理)=最大独立集的补集最大匹配经典的三种模型  这题就是最小顶点覆盖,顺便这题留给我的经验就是调试的时候一定要细心细心再细心对模板的各个细节都要熟!! #i ...

  2. 【分块打表】bzoj 3758 数数

    [题目描述] Description 神犇最近闲来无事,于是就思考哲学,研究数字之美.在神犇看来,如果一个数的各位能够被分成两个集合,而且这两个集合里的数的和相等,那么这个数就是优美的(具体原因就只有 ...

  3. iOS时钟,秒针扫秒样式

    昨天做一个时钟小demo,发现了一些问题. 描述能力有限,我封装好了一个时钟框架,朋友们可以参考      https://github.com/qianlishun/ClockView 点击这里可以 ...

  4. [NOIP1998] 提高组 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  5. msp430项目编程12

    msp430中项目---温度检测系统 1.ds18b20工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  6. php 压缩数据存储

    php 压缩数据存储 当接收到大量的数据时,存储到数据库和从数据库读取时,时间都比较慢,所以压缩一下入库可能会好一点. 仅供参考!!! 封装的压缩数据函数: /** * 压缩数据 * @param s ...

  7. django学习之- Cookie

    cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会生成一个随机字符串保存在cookie中返回给客户端,这样当 ...

  8. 毕业bg--hdu1881(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1881 01 背包  先按发起人离开的时间从小到大排序 然后再套01背包的模板 #include <iost ...

  9. InfluxDB useful commands

    InfluxDB 配置文件地址:/etc/influxdb/influxdb.conf 通过curl写数据 curl -i -XPOST 'http://localhost:8086/write?db ...

  10. 基于51单片机的CAN通讯协议C语言程序

      //-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...