1、题目大意:一道treap题,支持插入,询问第K大,还有全体修改+上一个值,如果某个点值小于x,那么就删除这个点

插入100000次,询问100000次,修改100次。。最后输出删了多少个点

2、分析:首先看修改是100次的,我就没有多想什么lazy,什么的

就是名次树,修改的话,我们就遍历treap,全部修改我们就O(n)搞一下

最后说一个坑爹的地方,就是插入前就否认的点不算T_T

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
    Node* ch[2];
    int r, v, s, c;
    inline bool operator < (const Node& rhs) const{
        return r < rhs.r;
    }
    inline int cmp(int x){
        if(x == v) return -1;
        if(x < v) return 0;
        return 1;
    }
    inline void maintain(){
        s = c;
        if(ch[0] != NULL) s += ch[0] -> s;
        if(ch[1] != NULL) s += ch[1] -> s;
        return;
    }
};
Node ft[500000];
struct treap{

    Node *p;
    int cnt;
    inline void init(){
        cnt = -1;
        p = NULL;
        return;
    }
    inline void rotate(Node* &o, int d){
        Node *k = o -> ch[d ^ 1];
        o -> ch[d ^ 1] = k -> ch[d];
        k -> ch[d] = o;
        o -> maintain();
        k -> maintain();
        o = k;
        return;
    }
    inline void insert(Node* &o, int x){
        if(o == NULL){
            o = &ft[++ cnt];
            o -> ch[0] = o -> ch[1] = NULL;
            o -> v = x;
            o -> r = rand();
            o -> c = 1;
        }
        else if(o -> v == x) o -> c ++;
        else{
            int d = o -> cmp(x);
            insert(o -> ch[d], x);
            if(o -> ch[d] -> r > o -> r) rotate(o, d ^ 1);
        }
        o -> maintain();
        return;
    }
    inline void A(Node* &o, int x){
        if(o == NULL) return;
        o -> v += x;
        A(o -> ch[0], x);
        A(o -> ch[1], x);
        return;
    }
    inline void S(Node* &o, int x){
        while(o != NULL && o -> v < x) o = o -> ch[1];
        if(o == NULL) return;
        if(o -> ch[0] != NULL) S(o -> ch[0], x);
        if(o -> ch[1] != NULL) S(o -> ch[1], x);
        if(o != NULL) o -> maintain();
        return;
    }
    inline int k_th(Node* &o, int k){
        int ls = 0, rs = 0;
        if(o -> ch[0] != NULL) ls = o -> ch[0] -> s;
        if(ls >= k) return k_th(o -> ch[0], k);
        else if(ls + o -> c >= k) return o -> v;
        else return k_th(o -> ch[1], k - ls - o -> c);
    }
} wt;
int main(){
    int n, m, orz = 0;
    scanf("%d%d", &n, &m);
    wt.init();
    for(int i = 1; i <= n; i ++){
        char str[5]; int k;
        scanf("%s%d", str, &k);
        if(str[0] == 'I'){
            if(k >= m){
                orz ++;
                wt.insert(wt.p, k);
            }
        }
        else if(str[0] == 'A') wt.A(wt.p, k);
        else if(str[0] == 'F'){
            if(wt.p == NULL || k > wt.p -> s) printf("-1\n");
            else printf("%d\n", wt.k_th(wt.p, wt.p -> s - k + 1));
        }
        else {
            wt.A(wt.p, -k);
            wt.S(wt.p, m);
        }
    }
    printf("%d\n", orz - wt.p -> s);
    return 0;
}

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

  1. bzoj1503 郁闷的出纳员

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

  2. [BZOJ1503]郁闷的出纳员(Splay)

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

  3. bzoj1503 郁闷的出纳员 splay版

    自己yy的写法 可能有点奇怪吧 详情看代码 还是蛮短的 #include<cstdio> #include<cstring> #include<algorithm> ...

  4. bzoj1503 郁闷的出纳员(平衡树,思维)

    题目大意: 现在有n个操作和一个最低限度m \(I\)命令\(I\ k\)新建一个工资档案,初始工资为k. \(A\)命令$A\ k $把每位员工的工资加上k \(S\)命令$S\ k $把每位员工的 ...

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

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

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

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

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

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

  8. 【bzoj1503】[NOI2004]郁闷的出纳员

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

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

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

随机推荐

  1. ES6之模版字符串

    ES6之模版字符串 最近在项目中使用了ES6的模版字符串,在这里加以总结. 1.之前我们也可以使用JavaScript输出模版字符串,通常是下面这样的: $("#result"). ...

  2. 在浏览器输入 URL 后会发生什么?超级详细介绍

    一个古老的面试问题:当你在浏览器中输入whosmall.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节. 这将是一个协作的过程,所以深入挖 ...

  3. 从.o文件中提取指定开头依赖于外部接口的脚本

    nm -g audio_la-audio.o | grep " U " | awk '{ print $2}' | grep "^gst_"

  4. qt5.4

    rm -f libQt5Qml.so.5.4.0 libQt5Qml.so libQt5Qml.so.5 libQt5Qml.so.5.4g++ -Wl,-O1,--sort-common,--as- ...

  5. SQL Server编程(02)自定义函数

    在编程过程中,我们通常把特定的功能语句块封装称函数,方便代码的重用.我们可以在SQL Server中自定义函数,根据函数返回值的区别,我们自定义的函数分两种:标量值函数和表值函数. 自定义函数的优点: ...

  6. bootstrap的学习-基础样式和排版一

    一.列表去除样式和横排排列 classs="list-unstyled","list-inline" 二.[表格].table 类指定基本样式,.table-s ...

  7. easyUI datagrid学习笔记

    1.easyUI表格的列属性 formatter:function(value,rowdata,rowindex) { return '['+value+']';//格式化,给每个值加上'[]': } ...

  8. Windows7、8无法访问其他计算机共享盘

    Windows7.8无法访问其他计算机共享盘 WIN7 访问共享的时候提示用户名和密码不正确,在XP系统上可以正常访问 一.win+r   gpedit.msc    进行组策略如图所示 二.wind ...

  9. sql编程小结

    对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...

  10. js 限制input输入字节长度

    function WidthCheck(str, maxLen){ var w = 0; var tempCount = 0; //length 获取字数数,不区分汉子和英文 for (var i=0 ...