题目描述

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。
工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘了一位新员工,我就得为他新建一个工资档案。
老板经常到我这边来询问工资情况,他并不问具体某位员工的工资情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后告诉他答案。
好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样,不是很困难吧?
如果某个员工的初始工资低于最低工资标准,那么将不计入最后的答案。

分析

模拟赛的题目是这道题目的改编,成功把自己卡成40分QwQ。
其实就是一个treap的模板,在下降的时候要把整体一起下降。
I命令:加入一个员工 我们在平衡树中加入k-minn
A命令:把每位员工的工资加上k delta加k即可
S命令:把每位员工的工资扣除k 此时我们就需要考虑会不会导致一大批员工离开;我们插入minn-delta,然后使小于minn-delta的点一起移动到根的右子树的左子树,一举消灭;
最后一个命令就是直接查询kth就可以了。
代码好久之前码的,码风不大一样。

代码

# include <bits/stdc++.h>
# define N 100005
using namespace std ;
struct Treap{
    int ch[N][2] , rd[N] , sz[N] , v[N] , num[N] ;
    int root , sum , delta ;
    void maintain( int &o ) { sz[o] = sz[ch[o][0]] + sz[ch[o][1]] + 1 ; }
    void right_rotate( int &o ) {
        int lson = ch[o][0] ; ch[o][0] = ch[lson][1] ; ch[lson][1] = o ; sz[lson] = sz[o] ;
        maintain(o) ; o = lson ;
    }
    void left_rotate( int &o ) {
        int rson = ch[o][1] ; ch[o][1] = ch[rson][0] ; ch[rson][0] = o ; sz[rson] = sz[o] ;
        maintain(o) ; o = rson ;
    }
    void insert( int &o , int x ) {
        if ( o == 0 ) { sum ++ ; o = sum ; rd[o] = rand() ; num[o] = x ; sz[o] = 1 ; return ; }
        sz[o] ++ ;
        if ( x < num[o] ) { insert( ch[o][0] , x ) ; if ( rd[ch[o][0]] < rd[o] ) right_rotate(o) ; }
        else { insert( ch[o][1] , x ) ; if ( rd[ch[o][1]] < rd[o] ) left_rotate(o) ; }
    }
    int del( int &o , int x ) {
        int tmp ; if ( o == 0 ) return 0 ;
        if ( num[o] < x ) { tmp = sz[ch[o][0]] + 1 ; o = ch[o][1] ; return tmp + del( o , x ) ; }
        else { tmp = del( ch[o][0] , x ) ; sz[o] -= tmp ; return tmp ; }
    }
    int find( int o , int x ) {
        if ( sz[ch[o][0]] + 1 == x ) return num[o] + delta ;
        else if ( sz[ch[o][0]] + 1 < x ) return find( ch[o][1] , x - sz[ch[o][0]] - 1 ) ;
        else return find( ch[o][0] , x ) ;
    }
};
Treap Tp ;
int n , m , cnt ;
int main () {
    scanf( "%d%d" , &n , &m ) ;
    for ( int i = 1 ; i <= n ; i ++ ) {
        char s[10] ; int x ;
        scanf( "%s%d" , s , &x ) ;
        if ( s[0] == 'I' ) if ( x >= m ) Tp.insert( Tp.root , x - Tp.delta ) ;
        if ( s[0] == 'A' ) Tp.delta += x ;
        if ( s[0] == 'S' ) Tp.delta -= x , cnt += Tp.del( Tp.root , m - Tp.delta ) ;
        if ( s[0] == 'F' ) {
            if ( x > Tp.sz[Tp.root] ) printf( "-1\n" ) ;
            else printf( "%d\n" , Tp.find( Tp.root , Tp.sz[Tp.root] - x + 1 ) ) ;
        }
        //cout << "cnt : " << cnt << endl ;
    }
    printf( "%d\n" , cnt ) ;
    return 0 ;
}

[luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】的更多相关文章

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

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

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

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

  3. Luogu P1486 [NOI2004]郁闷的出纳员(平衡树)

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

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

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

  5. bzoj1503: [NOI2004]郁闷的出纳员(伸展树)

    1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...

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

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

  7. [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)

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

  8. 2018.08.06 bzoj1503: [NOI2004]郁闷的出纳员(非旋treap)

    传送门 平衡树简单题. 直接用fhgtreap实现分裂和合并就没了. 代码: #include<bits/stdc++.h> #define N 100005 using namespac ...

  9. BZOJ1503: [NOI2004]郁闷的出纳员(Splay)

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

随机推荐

  1. 使用队列queue实现一个简单的生产者消费者模型

    一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...

  2. java总结:double取两位小数的多种方法

    1.方法一 四舍五入: import java.math.BigDecimal; double f = 111231.5585; BigDecimal b = new BigDecimal(f); d ...

  3. React Native之通知栏消息提示(android)

    React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...

  4. Notepad++的一个用法 转换为unix 格式的文件

    1. 跟昨天的linux 下面无法执行脚本的blog 一样 今天发现 notepad++ 有一个功能如下图: 双击 就能够选择文件的类型.. 转换为 unix 格式 就可以 在linux 下面执行了. ...

  5. picker-view 组件 的value失效问题

    首先检查是不是漏了绑定关系 组件内 组件引用 如过还不行就用下面的方法,顺序问题 在给暂时列表赋值之后再对value赋值

  6. day 7-18 mysql case when语句

    概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...

  7. 将选中项的value值赋给select的title

    $('select').change(function () { $(this).attr("title",$(this).find("option:selected&q ...

  8. 爬取B站视频

    先安装you_get pip install you_get 爬取代码,爬了个ASMR的,学习困了自我催眠 import sys from you_get import common as you_g ...

  9. llegalStateException: getWriter() has already been called for this response

    我使用Springmvc的处理器进行向AJAX传值时出现的问题 当我使用 PrintWriter out = response.getWriter();out.print("用户不存在,请先 ...

  10. Java多线程之单例模式(线程安全)

    package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/20 * @Descrip ...