bzoj1503 Splay 维护名次数,支持删除
题目: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 维护名次数,支持删除的更多相关文章
- 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)
未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 448 Solved: 150 Description ...
- HNOI2004宠物收养所(splay维护二叉搜索树模板题)
描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- Box HDU - 2475 (Splay 维护森林)
Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作. 操作 \(1\):把 \ ...
- iOS 限制TextField输入长度(支持删除)
if (textField == _phoneTF) { //支持删除 && ) { return YES; } ) { _phoneTF.text = [textField.text ...
- BZOJ 3729 splay维护DFS序+博弈论
思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...
- BZOJ 1492 [NOI2007]货币兑换Cash (CDQ分治/splay 维护凸包)
题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易 ...
- BZOJ 1251 Splay维护序列
思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...
- BZOJ1014[JSOI2008]火星人prefix(splay维护hash)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- bzoj3786星系探索(splay维护dfs序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
随机推荐
- python的新特性
http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...
- 【API】Mysql UDF BackDoor
1.MySQL UDF是什么 UDF是Mysql提供给用户实现自己功能的一个接口,为了使UDF机制起作用,函数必须用C或C ++编写,并且操作系统必须支持动态加载.这篇文章主要介绍UDF开发和利用的方 ...
- 一步一步搭建11gR2 rac+dg之DG 机器配置(七)【转】
DG 机器配置 转自: 一步一步搭建11gR2 rac+dg之DG 机器配置(七)-lhrbest-ITPUB博客http://blog.itpub.net/26736162/viewspace-12 ...
- ARC073E Ball Coloring
Problem AtCoder Solution 把点映射至二维平面,问题就变成了给定 \(n\) 个点,可以把点对 \(y=x\) 对称,求覆盖所有点的最小矩形面积. 可以先把所有点放到 \(y=x ...
- [Android Studio] Android Studio如何快速生成get,set,tostring,构造函数
刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项.但是很遗憾,找不到. 那这边如何快速的set,get或者生成构 ...
- ADB常用命令(二)
参考 http://adbshell.com/commands 常用命令 查看adb 版本 adb version 打印所有附加模拟器/设备的列表 adb devices 设备序列号 adb get ...
- vue总结 01基础特性
最近有时间来总结一下vue的知识: 一.vue.js 被定义成一个开发web界面的前端库,是一个非常轻量的工具.vue.js本身具有响应式和组件化的特点. 我们不需要在维护视图和数据的统一上花费大量的 ...
- ipad webapp禁止长按选择
1.禁止长按屏幕弹出对话框并选中文字 /*禁止长按选择文字事件*/ * { -webkit-touch-callout: none; -webkit-user-select: none; -khtml ...
- 牛客红包OI赛 C 小可爱表白
据说是个公式题. Code #include<cstdio> #include<cstring> #include<algorithm> using namespa ...
- 5 个非常有用的 Laravel Blade 指令,你用过哪些?
接下来我将带大家认识下五个 Laravel Blade 指令,这些指令将让你在解决特定问题时如虎添翼.如果你是刚接触 Laravel 的用户,这些小技巧能带你认识到 Laravel Blade 模板引 ...