Description

给出一个下限 \(m\) ,要求维护以下操作

  1. 插入一个数(如果小于下限就不加)
  2. 给每个数加上一个数
  3. 给每个数减去一个数,并且删除掉 \(< m\) 的所有数
  4. 求目前第 \(k\) 大的数(注意是第 \(k\) 大!从大到小排序后第 \(k\) 个)

    最后还要输出所有 3 操作一共删掉了多少个数

    \(n \leq 10^5\)

Solution

fhqtreap大法吼!

由于修改操作是全体操作,可以用一个 \(delta\) 记录修改总量

对于 1 操作插入权值 \(x - delta\)(如果 x <= m 就算了

对于 2 操作直接把 \(delta += x\)

对于 3 操作,先把 \(delta -= x\) ,然后把小于 \(m - delta\) 的全部删掉

具体实现可以 split 出来两个子树,然后直接让 root = 右子树,最后要输出的 ans += 左子树的 siz

对于 4 操作,split一下就行了

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
int n, m, delta;
struct node {
int d, rnd, siz;
node *ch[2];
inline void upd() {
int ret = 1; if(ch[0]) ret += ch[0]->siz;
if(ch[1]) ret += ch[1]->siz; siz = ret;
}
}pool[N], *cur = pool, *root;
inline int siz(node *p) { return p ? p->siz : 0; }
inline node *New(int d) { node *p = (cur++); p->d = d, p->siz = 1, p->rnd = rand(); return p; }
inline node *merge(node *p, node *q) {
if(!p || !q) return p ? p : q;
if(p->rnd < q->rnd) { p->ch[1] = merge(p->ch[1], q); p->upd(); return p; }
if(p->rnd >= q->rnd) { q->ch[0] = merge(p, q->ch[0]); q->upd(); return q; }
return 0;
}
inline void split(node *r, int k, node *&p, node *&q) {
if(!r) { p = q = 0; return ; }
if(siz(r->ch[0]) >= k) q = r, split(r->ch[0], k, p, r->ch[0]);
else p = r, split(r->ch[1], k - siz(p->ch[0]) - 1, r->ch[1], q); r->upd();
}
inline int rk(node *r, int x) {
return !r ? 0 : (r->d >= x ? rk(r->ch[0], x) : (siz(r->ch[0]) + 1 + rk(r->ch[1], x)));
}
inline node *del(int x) {
int k = rk(root, x); node *p, *q;
split(root, k, p, q); root = q; return p;
}
int main() { int ans = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
char op[5]; int d;
scanf("%s %d", op, &d);
if(op[0] == 'I') {
if(d < m) continue ;
if(!root) { root = New(d - delta); continue ; }
node *p, *q; split(root, rk(root, d - delta), p, q);
root = merge(merge(p, New(d - delta)), q);
} else if(op[0] == 'A') delta += d;
else if(op[0] == 'S') {
delta -= d; node *p = del(m - delta);
ans += siz(p);
} else {
// printf("%d\n", siz(root));
if(siz(root) < d) { printf("-1\n"); continue ; }
int sizz = siz(root);
node *p, *q, *r; split(root, (sizz - d + 1) - 1, p, q);
split(q, 1, q, r); printf("%d\n", q->d + delta); root = merge(merge(p, q), r);
}
} printf("%d\n", ans);
return 0;
}

题解【bzoj1503 [NOI2004]郁闷的出纳员】的更多相关文章

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

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

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

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

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

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

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

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

  5. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

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

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

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

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

  8. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

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

  9. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

随机推荐

  1. 深入理解JavaScript函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...

  2. nodejs的Cannot find module 'body-parser'

    http://blog.csdn.net/u014345860/article/details/77769253

  3. Windows下Visual Studio2017之AI环境搭建

    本博客主要包含以下3点: AI简介及本博客主要目的 环境介绍及安装原因 搭建环境及检验是否安装成功 离线模型的训练 时间分配:   时间 时长(分钟) 收集资料+写博客 6.12 11:28-12:2 ...

  4. Scrum Meeting 11.1

    成员 今日任务 明日计划 用时 徐越 学习利用servlet上传下载文件 代码迁移 4h 赵庶宏 数据库的连接及代码学习 数据库连接 2h 武鑫 设计界面;尝试写一些初步的代码,独立完成一些简单界面 ...

  5. oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)

    语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...

  6. spring--两个数据源模板

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...

  7. 关于map和hashmap

    今天做的程序猿那题 在公司里面,程序猿经常有一堆todolist要做,而这些todolist是产品经理分配给他们的.但是当程序员遇到不懂技术的产品狗时,就悲剧了.产品经理经常修改他们的todolist ...

  8. 阅读<构建之法>第三10、11、12章并提出问题

    <构建之法>第10.11.12章 第10章: 问题:对我们了解了用户的需求后,但是我们想法和做出来的软件会和用户的需求有偏差,比如风格.界面的修饰等等,那么我们程序猿怎样才能让自己的想法更 ...

  9. Week2-作业1——关于阅读《构建之法》第1、2、16章的疑问与感悟

    关于阅读<构建之法>第1.2.16章的疑问与感悟 术语解释: 第2章,23页 什么是代码覆盖率? ———————————————————— 在测试中的代码覆盖率是指,你运行测试用例后,走过 ...

  10. RecyclerView 上拉加载下拉刷新

    RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...