题目大意:

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

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. xtu read problem training B - Tour

    B - Tour Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descriptio ...

  2. Coloring Brackets (区间DP)

    Once Petya read a problem about a bracket sequence. He gave it much thought but didn't find a soluti ...

  3. 相应缓存设置HttpCacheability 枚举

      成员名称 说明   NoCache 设置 Cache-Control: no-cache 标头.如果没有字段名,则指令应用于整个请求,且在满足请求前,共享(代理服务器)缓存必须对原始 Web 服务 ...

  4. hihoCoder#1196 : 高斯消元·二(开关灯问题)

    传送门 高斯消元解异或方程组 小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi. 小Ho:小Hi,这次又该怎么办呢? 小Hi:让我们来分析一下吧. 首先对于每一个格子的状态,可 ...

  5. [luoguP2679] 子串(DP)

    传送门 气死我了,自己YY的方法只能得70分. 一个下午都在搞这道题. 至于正解,真的不想写了. 请移步 here #include <cstdio> #define M 201 #def ...

  6. java邮件工具类【最终版】

    http://www.xdemo.org/java-mail/ 对比链接中,添加了抄送和暗抄送功能(已解决,如图代码:抄送不能多个用户,会报错,未解之谜) sendHtmlmail方法可以发送附件以及 ...

  7. Linux(1):基本配置

    linux里面的网络(网卡)配置: 1. 输出 setup 命令进行设置 2. 选择 "Network configuration" ,按 回车键 3. 选择 "Devi ...

  8. 转 蓝桥杯 历届试题 波动数列 [ dp ]

    传送门   历届试题 波动数列   时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个 ...

  9. POJ 2488 A Knight's Journey【DFS】

    补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...

  10. Codeforces 653A Bear and Three Balls【水题】

    题目链接: http://codeforces.com/problemset/problem/653/A 题意: 给定序列,找是否存在连续的三个数. 分析: 排序~去重~直接判断~~ 代码: #inc ...