题目: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. numpy细碎知识点

    np.random.rand() 基于python自带模块random的random函数的一个延伸吧,生成指定数量的列表 np.random.rand(a,b) 参数a,b均为整型,生成含有a个元素的 ...

  2. aarch64_l2

    libfreehand-devel-0.1.1-5.fc26.aarch64.rpm 2017-05-23 07:16 26K fedora Mirroring Project libfreehand ...

  3. Add custom daemon on Linux System

    Ubuntu add custom service(daemon) Task 需要在系统启动的时候自动启动一个服务(后台程序),在系统关闭的时候关闭服务. 比如在部署某个应用之前,需要将某个任务设置成 ...

  4. 02 Go 1.2 Release Notes

    Go 1.2 Release Notes Introduction to Go 1.2 Changes to the language Use of nil Three-index slices Ch ...

  5. mysqlbinlog的日志类型

    一.mysqlbinlog简介 binlog又叫二进制日志文件,它会将mysql中所有修改数据库数据的Query以二进制的形式记录到日志文件中,如:create,insert,drop,update等 ...

  6. No.1 selenium学习之路之浏览器操作

    selenium基础,首先就是浏览器的相关操作 下面描述几种浏览器的常用操作 1.打开浏览器 webdriver后面添加想要打开的浏览器 Ie或者Chrome 2.打开指定页面(百度) 3.休眠时间 ...

  7. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  8. springMVC源码分析--HttpMessageConverter参数read操作(二)

    上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...

  9. Java流(Stream)、Scanner类

    读取控制台输入 Java 的控制台输入由 System.in 完成. 为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流. ...

  10. ASP.NET MVC下判断用户登录和授权状态方法

    在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization),则对于某种用户角色才开放. 在a ...