题目大意:

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

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. XV6环境搭建及注意事项

    Ubuntu16.04SLT 64位 工具链 sudo apt-get install gcc-multilib libsdl1.2-dev, libtool-bin, libglib2.0-dev, ...

  2. NYOJ301-递推求值

    递推求值 nyoj上矩阵专题里的10道题水了AC率最高的5道,惭愧,还不是完全自己写的,用了几乎两周的时间.模板题我是有自信写出来的,但对于高级一点的矩阵构造,我还是菜的抠脚. 这题感谢MQL大哥和她 ...

  3. NYOJ27水池数目,类似于FZU1008最大黑区域,简单搜索题~~~

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

  4. Method and system for early speculative store-load bypass

    In an embodiment, the present invention describes a method and apparatus for detecting RAW condition ...

  5. 导师高茂源:用CODEX创新方法破解西方创新“秘密”(转)

    高茂源,“CODEX创新体系”的创立者,精一学社的创业导师.“CODEX”是Copy.Optimize.Dimension.Ecosystem.Extra五个单词的缩写,该体系精炼了现在世界上流行的创 ...

  6. APP后端处理视频的方案

    在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会. 后台常见的视频处理有以下几种: ·          ...

  7. Codeforces 549C(博弈)

    C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. HDU 5667 Sequence

    指数有递推式,可以通过矩阵快速幂来求解.再用下面这公式快速幂取模即可. (C是素数) #include<cstdio> #include<cstring> #include&l ...

  9. 进入一个jsp直接跳到另一个jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  10. Delphi字符串加密/解密

    unit uEncrypt_Decrypt;   interface   uses SysUtils;   const XorKey: array[0..7] of Byte = ($B2, $09, ...