题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503

题解:

维护一颗Splay和一个外部变量,树中每个节点表示一个人,节点权值a + 外部变量delta = 该员工工资。

细节看代码。

注意:一进来工资就低于最低工资的人不能算是“离开公司”的人。

 #include <cstdio>
#define fprintf(...)
#define maxn 100100 struct Splay {
int key[maxn], pre[maxn], son[maxn][], siz[maxn], ntot, root;
int trash[maxn], rtot; Splay():ntot(),root(),rtot(){}
void update( int nd ) {
siz[nd] = siz[son[nd][]] + siz[son[nd][]] + ;
}
void rotate( int nd, int d ) {
int p = pre[nd];
int s = son[nd][!d];
int ss = son[s][d]; if( p ) son[p][ nd==son[p][] ] = s;
else root = s;
son[nd][!d] = ss;
son[s][d] = nd; if( ss ) pre[ss] = nd;
pre[nd] = s;
pre[s] = p; update( nd );
update( s );
}
void splay( int nd, int top= ) {
while( pre[nd]!=top ) {
int p = pre[nd];
int nl = nd==son[p][];
if( pre[p]==top ) {
rotate( p, nl );
} else {
int pp = pre[p];
int pl = p==son[pp][];
if( nl==pl ) {
rotate( pp, pl );
rotate( p, nl );
} else {
rotate( p, nl );
rotate( pp, pl );
}
}
}
}
int newnode( int k, int p ) {
int nd;
if( rtot ) nd = trash[rtot--];
else nd = ++ntot;
key[nd] = k;
pre[nd] = p;
son[nd][] = son[nd][] = ;
siz[nd] = ;
return nd;
}
void insert( int k ) {
fprintf( stderr, "insert(%d)\n", k );
if( !root ) {
root = newnode( k, );
return;
}
int nd = root;
while( son[nd][ k<key[nd] ] )
nd = son[nd][ k<key[nd] ];
son[nd][ k<key[nd] ] = newnode( k, nd );
update( nd );
splay( nd, );
}
void erase_subtree( int nd ) {
fprintf( stderr, "erase_subtree(%d)\n", nd );
if( !nd ) return;
erase_subtree( son[nd][] );
erase_subtree( son[nd][] );
trash[++rtot] = nd;
}
void erase( int k ) {
fprintf( stderr, "erase(%d)\n", k );
int nd = root;
int active = nd;
while( nd ) {
if( key[nd]<=k ) {
int p = pre[nd];
int ls= son[nd][]; if( p ) son[p][ nd==son[p][] ] = son[nd][];
else root = son[nd][];
pre[son[nd][]] = p; pre[nd] = ;
son[nd][] = ; erase_subtree( nd ); if( p ) update( p );
nd = ls;
} else {
active = nd;
nd = son[nd][];
}
}
splay(active);
}
int nth( int n ) {
fprintf( stderr, "nth(%d)\n", n );
int nd = root;
while() {
int ls = siz[son[nd][]];
if( n<=ls ) {
nd=son[nd][];
} else if( n>=ls+ ) {
nd=son[nd][];
n -= ls+;
} else
break;
}
splay( nd );
return key[nd];
}
void print( int nd ) {
if(!nd) return;
print( son[nd][] );
fprintf( stderr, "%d %d %d %d %d\n", nd, pre[nd], son[nd][], son[nd][],
key[nd] );
print( son[nd][] );
}
}; Splay T;
int n, delta, limit, cnt; int main() {
//freopen( "input", "r", stdin );
scanf( "%d%d", &n, &limit );
delta = ;
cnt = ;
while(n--) {
char ch[];
int k;
scanf( "%s%d", ch, &k );
switch(ch[]) {
case 'I':
if( k<limit ) break;
cnt++;
k -= delta;
T.insert( k );
break;
case 'A':
delta += k;
break;
case 'S':
delta -= k;
T.erase( limit-delta- );
break;
case 'F':
if( !(<=k && k<=T.siz[T.root]) ) printf( "-1\n" );
else printf( "%d\n", T.nth(k)+delta );
break;
}
fprintf( stderr, "delta=%d\n", delta );
//T.print( T.root );
fprintf( stderr, "\n" );
}
printf( "%d\n", cnt-T.siz[T.root] );
}

bzoj1503 Splay 维护名次数,支持删除的更多相关文章

  1. 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)

    未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 448  Solved: 150 Description ...

  2. HNOI2004宠物收养所(splay维护二叉搜索树模板题)

    描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  3. Box HDU - 2475 (Splay 维护森林)

    Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作. 操作 \(1\):把 \ ...

  4. iOS 限制TextField输入长度(支持删除)

    if (textField == _phoneTF) { //支持删除 && ) { return YES; } ) { _phoneTF.text = [textField.text ...

  5. BZOJ 3729 splay维护DFS序+博弈论

    思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...

  6. BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)

    题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...

  7. BZOJ 1251 Splay维护序列

    思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...

  8. BZOJ1014[JSOI2008]火星人prefix(splay维护hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  9. bzoj3786星系探索(splay维护dfs序)

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

随机推荐

  1. jquery easyui 扩展验证

    $.extend($.fn.validatebox.defaults.rules, {  idcard : {// 验证身份证          validator : function(value) ...

  2. 洛谷 P4248: bzoj 3238: [AHOI2013]差异

    题目传送门:洛谷 P4248. 题意简述: 定义两个字符串 \(S\) 和 \(T\) 的差异 \(\operatorname{diff}(S,T)\) 为这两个串的长度之和减去两倍的这两个串的最长公 ...

  3. 全面了解Nginx主要应用场景【转】

    前言 本文只针对 Nginx 在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 ...

  4. 双机/RAC/Dataguard的区别【转】

    本文转自 双机/RAC/Dataguard的区别-jasoname-ITPUB博客 http://blog.itpub.net/22741583/viewspace-684261/ Data Guar ...

  5. 01.Web基础和HTML初始

    1.1 上网就是请求数据 我们先不直接解决这个问题,我们做一个小实验.我们每个人的电脑里面,都有一个神秘的文件夹: C:\Users\Weiheng\AppData\Local\Microsoft\W ...

  6. Jenkins关联GitHub进行构建

    一.创建一个自由风格的项目 并在高级中勾选你构建完成后保存项目的路径 二.配置你存放代码的GitHub的地址并添加用户名密码 三.立即构建

  7. python并行计算(持续更新)

    工作中需要对tensorflow 的一个predict结果加速,利用python中的线程池 def getPPLs(tester,datas): for line in datas: tester(l ...

  8. Linux网络综合命令——IP

    1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户.几乎所有的Linux发行版本都支持该命令. ...

  9. jenkins Error performing command: git ls-remote -h

    Jenkins新建项目中源码管理使用Git时遇到如下问题: Failed to connect to repository : Error performing command: git ls-rem ...

  10. 为django平台生成模拟用户,建立用户组,并将用户加入组

    书接上篇BLOG. 当我们可以用manage.py自定义命令来生成模拟数据时, 我们面对的就是如何操作ORM的问题了. 这两天,我为我们的内部系统的所有数据表,都生成了模拟数据. 有几个心得,记录于此 ...