传送门

题目看起来玄乎,但其实只需要一点点小 trick 就可以了.

我们可以用一个全局的 delta 来维护工资的调整记录

对于每一个新加入的员工,先判断是否低于最低工资下限,如果是,直接踢出,不做任何操作,否则,将其插入 Treap 中,不过这时为了不对以后的查询产生影响,我们要插入的值时 key-delta (想一想,为什么?)

对于加工资的操作,直接在 delta 上统计即可.而减工资,这可能牵扯到会有员工离开,所以我们不能只修改delta

我们在修改 delta 之后,把 Treap 按权值分割,分割标准是 minn-delta-1 (想一想,为什么?提示:不等式移项)

然后直接舍弃整个的左子树,此时的左子树就是所有会离开公司的员工代表的节点,所以最后的答案要加上该子树的 size

对于查询操作,直接查询出来的第 k 小(注意!!!是第 k 小)加上 delta 即可

Code:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#define Drt pair < Treap * , Treap * >
#define siz(rt) ( rt == NULL ? 0 : rt->size )
#define int long long using std :: pair ; int n , minn , cnt , delta ; struct Treap {
Treap * son[2] ;
int val , size , rank ;
Treap (int val) : val ( val ) { size = 1 ; son[0] = son[1] = NULL ; rank = rand () ; }
inline void maintain () {
this->size = 1 ;
if ( this->son[0] != NULL ) this->size += this->son[0]->size ;
if ( this->son[1] != NULL ) this->size += this->son[1]->size ;
return ;
}
} * root = NULL ; inline Drt Split ( Treap * rt , int k ) {
if ( rt == NULL ) return Drt ( NULL , NULL ) ;
Drt t ;
if ( k <= siz ( rt->son[0] ) ) {
t = Split ( rt->son[0] , k ) ; rt->son[0] = t.second ;
rt->maintain () ; t.second = rt ;
} else {
t = Split ( rt->son[1] , k - siz ( rt->son[0] ) - 1 ) ;
rt->son[1] = t.first ; rt->maintain () ; t.first = rt ;
}
return t ;
} inline Drt SplitV ( Treap * rt , int key ) {
if ( rt == NULL ) return Drt ( NULL , NULL ) ;
Drt t ;
if ( rt->val <= key ) {
t = SplitV ( rt->son[1] , key ) ; rt->son[1] = t.first ;
rt->maintain () ; t.first = rt ;
} else {
t = SplitV ( rt->son[0] , key ) ; rt->son[0] = t.second ;
rt->maintain () ; t.second = rt ;
}
return t ;
} inline Treap * merge ( Treap * x , Treap * y ) {
if ( x == NULL ) return y ; if ( y == NULL ) return x ;
if ( x->rank < y->rank ) {
x->son[1] = merge ( x->son[1] , y ) ;
x->maintain () ; return x ;
} else {
y->son[0] = merge ( x , y->son[0] ) ;
y->maintain () ; return y ;
}
} inline int Getrank ( Treap * rt , int key ) {
if ( rt == NULL ) return 0 ;
if ( key <= rt->val ) return Getrank ( rt->son[0] , key ) ;
else return Getrank ( rt->son[1] , key ) + siz ( rt->son[0] ) + 1 ;
} inline int Getkth ( Treap * & rt , int key ) {
Drt x = Split ( rt , key - 1 ) ;
Drt y = Split ( x.second , 1 ) ;
Treap * node = y.first ;
rt = merge ( x.first , merge ( node , y.second ) ) ;
return node == NULL ? 0 : node->val ;
} inline void insert ( Treap * & rt , int key ) {
int k = Getrank ( rt , key ) ; Drt t = Split ( rt , k ) ;
Treap * node = new Treap ( key ) ;
rt = merge ( t.first , merge ( node , t.second ) ) ;
return ;
} signed main () {
scanf ("%lld%lld" , & n , & minn ) ;
while ( n -- ) {
char opt[4] ; int key ;
scanf ("%s%lld" , opt , & key ) ;
if ( opt[0] == 'I') {
if ( key < minn ) continue ;
insert ( root , key - delta ) ;
}
if ( opt[0] == 'A') delta += key ;
if ( opt[0] == 'S') {
delta -= key ;
Drt t = SplitV ( root , minn - delta - 1 ) ;
root = t.second ; cnt += siz ( t.first ) ;
}
if ( opt[0] == 'F') {
if ( key > siz ( root ) ) printf ("-1\n") ;
else printf ("%lld\n" , Getkth ( root , siz ( root ) - key + 1 ) + delta ) ;
}
}
printf ("%lld\n" , cnt ) ;
system ("pause") ; return 0 ;
}

NOI2004郁闷的出纳员的更多相关文章

  1. BZOJ 1503: [NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 10526  Solved: 3685[Submit][Stat ...

  2. [BZOJ1503][NOI2004]郁闷的出纳员

    [BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...

  3. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  4. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Statu ...

  5. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

  6. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  7. 1503: [NOI2004]郁闷的出纳员 (SBT)

    1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec  Memory ...

  8. P1486 [NOI2004]郁闷的出纳员

    P1486 [NOI2004]郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷 ...

  9. [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  10. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

随机推荐

  1. 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么

    该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...

  2. JQ倒计时,正计时

    <p class="lastP">距离二维码过期还剩<strong></strong>秒,过期后自动刷新页面.</p><scr ...

  3. Vjudge Code

    Stylus @-moz-document url-prefix("https://cn.vjudge.net/"), url-prefix("https://vjudg ...

  4. 最长公共子序列(POJ1458)

    给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致. Sample Input: abcfbc abfcabpr ...

  5. ShoppingCart

    数据库设计 表结构 [dbo].[AdminInfo] AdminID, AdminName, AdminPassword, RoleID [dbo].[BK_Car] ID, CarID, ISBN ...

  6. 【CSA35G】【XSY3318】Counting Quests DP 拉格朗日反演 NTT

    题目大意 zjt 是个神仙. 一天,zjt 正在和 yww 玩猜数游戏. zjt 先想一个 \([1,n]\) 之间的整数 \(x\),然后 yww 开始向他问问题. yww 每次给 zjt 一个区间 ...

  7. fastclick原理剖析及其用法

    移动端点击延迟事件 移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟. 原因: 移动端的双击会缩放导致click判断延迟.这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件, ...

  8. ubuntu mirror

    # apt-mirror configuration file ## The default configuration options (uncomment and change to overri ...

  9. Mysql高性能笔记(一):Schema与数据类型优化

    1.数据类型 1.1.几个参考优化原则 a.  更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...

  10. 微信公众、QQ群、知识星球(附比特币链接)

    文章一般都会在公众号抢先预览,一个系列出差不多的时候一般博客园汇总一下(文章很长) 微信公众号:逸鹏说道(dotnetcrazy) 群友刚创建的Python中级群,有一定Python基础的可以共同探讨 ...