传送门
题目看起来玄乎,但其实只需要一点点小 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 longusing 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 ;
}

转载于:https://www.cnblogs.com/Equinox-Flower/p/10785300.html

NOI2004郁闷的出纳员相关推荐

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

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

  2. 洛谷P1486 [NOI2004] 郁闷的出纳员 题解

    P1486 [NOI2004] 郁闷的出纳员 题目链接:P1486 [NOI2004] 郁闷的出纳员 题意:维护一个数据结构,支持 插入一个大小为 kkk​ 的值,小于下界时不插入 所有元素加上 kk ...

  3. bzoj1503: [NOI2004]郁闷的出纳员

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

  4. BZOJ1503:[NOI2004]郁闷的出纳员——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...

  5. [NOI2004]郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...

  6. BZOJ1503[NOI2004]郁闷的出纳员——treap

    OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...

  7. [NOI2004]郁闷的出纳员 Treap

    蒟蒻刚学旋转Treap,打个板子练练手. 题目描述 原题来自:NOI 2004 OIER 公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是 ...

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

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  9. NOI2004 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  10. 洛谷 P1486 [NOI2004]郁闷的出纳员

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

最新文章

  1. python输入球的半径_基于用户输入半径的Myro移动机器人
  2. 长沙理工大学计算机系教师,长沙理工大学数学与计算机科学学院导师介绍:王晚生...
  3. Linux:vim环境设置
  4. k8s Service之NodePort
  5. TypeError: ‘BasePermissionMetaclass‘ object is not iterable
  6. let finger cross
  7. php对外发包引发服务器崩溃的终极解决方法分享
  8. 虚线 实现_redis跳跃表实现
  9. OpenVINO Inference Engine之GetAvailableDevices
  10. ubuntu中一些软件的命令安装及设置
  11. java删除指定文件_java删除指定目录下指定格式文件的方法
  12. linux进程(fork,waitpid)
  13. 关于线性字符串匹配的算法-----KMP的算法
  14. php monolog 使用,PHP 依赖工具 monolog的使用
  15. TOGAF 9 Certification 有用书签
  16. ads2020卸载 ads软件怎么卸载干净ads2016 ads2019卸载不干净无法重新安装 ads2017彻底卸载 ads2017卸载时删不尽
  17. 大数据和人工智能AI的联系和区别
  18. 地级市空气污染、空气质量、PM2.5日度数据
  19. CNN和机器学习算法性能测试
  20. 联想台式计算机重装系统教程,联想台式机重装系统win7图文教程

热门文章

  1. 实例36:python
  2. tc溜溜865手机投屏卡_溜溜tcgames老版本(电脑玩手机游戏)-溜溜TC Games32位/64位旧版本PC下载V2.0.0官网安卓真机投屏-西西软件下载...
  3. python调用数据库数据类型_Python使用Mysql官方驱动(取出dict类型的数据)
  4. idea html ajax,在 IntelliJ IDEA 8.1中编写一个ajax jquery实例,取不到页面上的值
  5. 分时技术用户可以独占计算机资源,计算机基础第二章选择题(带答案修改版 )校过...
  6. docker构建oracle集群,docker 构建 oracle数据库 镜像-Go语言中文社区
  7. mysql connetor_python mysqlconnetor
  8. 快速解析大xml报文
  9. ajax 接收json数据的进一步了解
  10. myeclipse开发代码颜色搭配保护视力