P1486 [NOI2004] 郁闷的出纳员 FHQ-Treap
题意:
第一行有两个整数 nnn 和 minminmin。nnn 表示下面有多少条命令,minminmin 表示工资下界。
接下来的 nnn 行,每行一个字符xxx和一个整数 kkk,表示一条命令。命令可以是以下四种之一:
I k 新建一个工资档案,初始工资为 k。如果某员工的初始工资低于工资下界,他将立刻离开公司。
A k 把每位员工的工资加上 k 。
S k 把每位员工的工资扣除 k。
F k 查询第 k 多的工资。
在初始时,可以认为公司里一个员工也没有。
题解:
只做过一两道平衡树的题目,不过有一说一,这道题感觉非常模板。
其实就是模板题加了一个操作,区间修改的操作。
打一个lazy即可。
fhq-treap非常容易实现。
代码:
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;const int maxn=3e5+10;mt19937 rnd(233);int imin;struct FHQ{int cnt,root;int ls[maxn],rs[maxn],val[maxn],key[maxn],siz[maxn];int lazy[maxn];int newnode(int x){val[++cnt]=x;key[cnt]=rnd();siz[cnt]=1;return cnt;}void update(int node){siz[node]=siz[ls[node]]+siz[rs[node]]+1;}void push_down(int node){if(ls[node]){lazy[ls[node]]+=lazy[node];val[ls[node]]+=lazy[node];}if(rs[node]){lazy[rs[node]]+=lazy[node];val[rs[node]]+=lazy[node];}lazy[node]=0;}void spilt_val(int node,int vals,int &x,int &y){if(!node){x=y=0;return ;}if(lazy[node]) push_down(node);if(val[node]<=vals){x=node;spilt_val(rs[node],vals,rs[node],y);}else{y=node;spilt_val(ls[node],vals,x,ls[node]);}update(node);}int mer(int x,int y){if(!x||!y) return x+y;if(key[x]>key[y]){rs[x]=mer(rs[x],y);update(x);return x;}else{ls[y]=mer(x,ls[y]);update(y);return y;}}int x,y,z;void insert(int vals){if(vals<imin) return;spilt_val(root,vals,x,y);root=mer(mer(x,newnode(vals)),y);}void add(int x){val[root]+=x;lazy[root]+=x;}void sub(int x){val[root]-=x;lazy[root]-=x;spilt_val(root,imin-1,x,y);root=y;}int get_kth(int rank){if(siz[root]<rank) return -1;rank=siz[root]-rank+1;int node=root;while(node){push_down(node);if(siz[ls[node]]+1==rank) break;else if(siz[ls[node]]>=rank) node=ls[node];else{rank-=siz[ls[node]]+1;node=rs[node];}}return val[node];}
}tree;signed main(){ios::sync_with_stdio(false);cin.tie(0);int n;cin>>n>>imin;for(int i=1;i<=n;i++){char c;int x;cin>>c>>x;if(c=='I') tree.insert(x);else if(c=='A') tree.add(x);else if(c=='S') tree.sub(x);else if(c=='F'){int ans=tree.get_kth(x);//cout<<"debug "<<tree.siz[tree.root]<<endl;cout<<ans<<endl;}}cout<<tree.cnt-tree.siz[tree.root]<<endl;}
P1486 [NOI2004] 郁闷的出纳员 FHQ-Treap相关推荐
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 洛谷P1486 [NOI2004] 郁闷的出纳员 题解
P1486 [NOI2004] 郁闷的出纳员 题目链接:P1486 [NOI2004] 郁闷的出纳员 题意:维护一个数据结构,支持 插入一个大小为 kkk 的值,小于下界时不插入 所有元素加上 kk ...
- P1486 [NOI2004]郁闷的出纳员
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- 洛谷 P1486 [NOI2004]郁闷的出纳员
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- bzoj1503: [NOI2004]郁闷的出纳员
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题目: 1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec ...
- BZOJ1503[NOI2004]郁闷的出纳员——treap
OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...
- [NOI2004]郁闷的出纳员 Treap
蒟蒻刚学旋转Treap,打个板子练练手. 题目描述 原题来自:NOI 2004 OIER 公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 Treap
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
最新文章
- 《网络攻防实践》第七周作业
- amd一键超频怎么用_头条信息流“一键起量”工具怎么用?经验分享
- 看得见的开发管理方法—缺陷管理
- 笔记 英语二 考研先导课 0126
- springcloud工作笔记091---tk.mybatis.mapper.MapperException: 当前实体类不包含名为XXXXX的属性!
- 体验一下阿里云文字识别OCR
- 通过UA判断手机的类型
- Hbuilder链接逍遥模拟器
- 图深度学习——复杂图嵌入:异质图,二分图,多维图,超图,符号图,动态图
- 安卓手机突然很卡_为什么你的安卓手机越用越卡,真是内存不够?终于找到原因了!...
- 关于ceph的一些问题及解决
- CenterFusion代码复现
- 04-0002 PCA算法
- 武大计算机科学与技术弘毅学堂,武汉大学研究生精品课-百余新学子体验“弘毅学堂”...
- 电脑双核CPU具体是什么意思?
- 串的模式匹配算法---RK
- 无光驱无U盘 硬盘安装操作系统 NT6
- 从金蝶k3到金税盘_金蝶K3操作流程图详解
- 2020酒店互动电视IPTV系统七种解决方案
- 未来计算机的四大新技术是什么,汪成为院士:未来计算机技术发展四大动力