洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路:
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的更多相关文章
- [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- 洛谷 1486/BZOJ 1503 郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13866 Solved: 5069[Submit][Stat ...
- [BZOJ 1503]郁闷的出纳员(fhq treap)
[BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...
- 数据结构(跳跃表):NOI 2004 郁闷的出纳员
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- 洛谷 2042 BZOJ 1500 NOI 2005 维护数列
[题意概述] 维护一个数列,要求支持以下6种操作: [题解] 大Boss...可以用Treap解决 需要用到垃圾回收.线性建树. #include<cstdio> #include< ...
- NOI 2004 郁闷的出纳员(平衡树)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- NOI 2004 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...
随机推荐
- C# TTS-文本转语音
System.Speech 命名空间包含支持语音识别的类型,你可以从Visual Studio很方便的添加相关组件的引用. System.Speech相关介绍:https://msdn.microso ...
- AWS探索及创建一个aws EC2实例
一.AWS登陆 1.百度搜索aws,或者浏览器输入:http://aws.amazon.com 2.输入账户及密码登陆(注册流程按照提示走即可) 二.创建EC2实例(相当于阿里云的ecs) 1.找到E ...
- Unity FSM 有限状态机
翻译了一下unity wiki上对于有限状态机的案例,等有空时在详细写一下.在场景中添加两个游戏物体,一个为玩家并修改其Tag为Player,另一个为NPC为其添加NPCControl脚本,并为其将玩 ...
- NO.06--聊一聊“币”吧!
近期博主更新的频率明显慢来 ,一来是最近的工作比较忙碌,几个项目几乎同时要上线.二来是在思考是不是把我平时生活中的一些事情写进来博客,不只是分享分享技术. 趁着区块链.比特币火爆,博主也算是略有涉猎, ...
- ES6 之 解构赋值
本博文配合 阮一峰 <ES6 标准入门(第3版)>一书进行简要概述 ES6 中变量的解构赋值. 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这 ...
- Amazon Headlines Update on Activity in US West Coast Ports
According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...
- ES6的新特性(10)——Class 的基本语法
Class 的基本语法 简介 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子. function Point(x, y) { this.x = x; this.y ...
- 各团队对《t铁大导航》评价及我组回复
组名 对我们组的建议 我组回复 (1)跑男 你们的导航前期要做到什么样的程度呢?其实我一直是很期待你们完成时我能够用你们的导航来感受一下咱们铁大校园风情.你们用了数据结构算法来找最短路径,那你们能不能 ...
- Java中按值传递与按引用传递的区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-7
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 进一步优化功能与完善服务器. 明天计划完成的工作: 服务器是需要完善,后端的配置还需要修改. 工作中遇到的困难: 今日遇到的困难是服务器后端 ...