思路:

1. 此处的fhq treap的分裂是按照权值分裂然后插入的。将小于k的分为一棵子树,大于等于k的分为另一棵子树。

2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不用管,扔掉。

3. 维护一个加标记,注意不要忘记某个地方的pushdown和pushup

其他就是fhq treap的基本操作了

#include<bits/stdc++.h>
using namespace std;
#define ls a[x].l
#define rs a[x].r
const int N = 1e5 + ;
int root, tot, ans;
struct tree{
int l, r, atag, val, dat, siz;
}a[N];
struct fhq_treap{
void newnode(int &x, int val){
a[x = ++tot].dat = rand(); a[x].siz = ; a[x].val = val;
}
void addone(int x, int val){
if(!x) return;
a[x].val += val; a[x].atag += val;
}
void up(int x){
if(!x) return ;
a[x].siz = a[ls].siz + a[rs].siz + ;
}
void down(int x){
if(!x) return;
if(a[x].atag) addone(ls, a[x].atag), addone(rs, a[x].atag);
a[x].atag = ;
}
void Merge(int &x, int l, int r){
if(!l || !r) x = l + r;
else if(a[l].dat < a[r].dat) down(x = l), Merge(rs, rs, r), up(x);
else down(x = r), Merge(ls, l, ls), up(x);
}
void split(int x, int k, int &l, int &r){
if(!x) l = r = ;
else{
down(x);
if(a[x].val < k) l = x, split(rs, k, rs, r);
else r = x, split(ls, k, l, ls);
}
up(x);
}
void ins(int val){
int x;
newnode(x, val);
int l, r;
split(root, val, l, r); Merge(l, l, x); Merge(root, l, r);
}
int getval(int x, int rank){
if(x == ) return -;
down(x);
if(a[rs].siz >= rank) return getval(rs, rank);
if(a[rs].siz + >= rank) return a[x].val;
return getval(ls, rank - a[rs].siz - );
}
void del(int val){
int l;
split(root, val, l, root);
}
}treap;
int n, lim, k;
char ch[];
int main(){
scanf("%d%d", &n, &lim);
while(n--){
scanf("%s%d", ch, &k);
if(ch[] == 'I'){
if(k >= lim) treap.ins(k), ans++;
}
else if(ch[] == 'A') treap.addone(root, k);
else if(ch[] == 'S') treap.addone(root, -k), treap.del(lim);
else printf("%d\n", treap.getval(root, k));
}
printf("%d\n", ans - a[root].siz);
return ;
}

洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap的更多相关文章

  1. [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...

  2. bzoj 1503[NOI 2004] 郁闷的出纳员

    题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...

  3. 洛谷 1486/BZOJ 1503 郁闷的出纳员

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

  4. [BZOJ 1503]郁闷的出纳员(fhq treap)

    [BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...

  5. 数据结构(跳跃表):NOI 2004 郁闷的出纳员

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

  6. 洛谷 2042 BZOJ 1500 NOI 2005 维护数列

    [题意概述] 维护一个数列,要求支持以下6种操作: [题解] 大Boss...可以用Treap解决 需要用到垃圾回收.线性建树. #include<cstdio> #include< ...

  7. NOI 2004 郁闷的出纳员(平衡树)

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

  8. NOI 2004 郁闷的出纳员

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

  9. 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...

随机推荐

  1. 【SpringCloud】第十二篇: 断路器监控(Hystrix Turbine)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  2. spark读取外部配置文件的方法

    spark读取外部配置文件的方法 spark-submit  --files /tmp/fileName /tmp/test.jar 使用spark提交时使用--files参数,spark会将将本地的 ...

  3. 1.airflow的安装

    1.环境准备1.1 安装环境1.2 创建用户2.安装airflow2.1 安装python2.2 安装pip2.3 安装数据库2.4 安装airflow2.4.1 安装主模块2.4.2 安装数据库模块 ...

  4. LeetCode 206. Reverse Linked List(C++)

    题目: Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4 ...

  5. postman的巨坑 之 cookie

    问题描述:一个后端接口,该接口需要校验登录态,登录态通过cookie中的一个传参k判断.在保证登录的前提下,调用机器A上的接口一直报“用户未登录”,调机器B上就没问题,于是开始排查问题. 解决过程: ...

  6. iOS开发 常见错误

    一.NSAppTransportSecurity 错误提示:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL ...

  7. 【线段树维护复杂状态】Ryuji doesn't want to study

    https://nanti.jisuanke.com/t/31460 tree[rt].ans = tree[rt << 1].ans + tree[rt << 1 | 1]. ...

  8. lintcode-397-最长上升连续子序列

    397-最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 注意事 ...

  9. RabbitMQ 安装,配置

    1:安装 yum install -y rabbitmq-server   2:主要程序介绍 # 管理插件的程序 /usr/sbin/rabbitmq-plugins # 服务程序 /usr/sbin ...

  10. 遍历frame中的表单:

    遍历frame中的表单: public void table1() { // 查找frame List<WebElement> iframes = driver.findElements( ...