[BZOJ 1503]郁闷的出纳员(fhq treap)
[BZOJ 1503]郁闷的出纳员
题面
第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。
接下来的n行,每行表示一条命令。命令可以是以下四种之一:
| 名称 | 格式 | 作用 |
|---|---|---|
| I命令 | I_k | 新建一个工资档案,初始工资为k。如果某员工的初始工资低于工资下界,他将立刻离开公司。 |
| A命令 | A_k | 把每位员工的工资加上k |
| S命令 | S_k | 把每位员工的工资扣除k |
| F命令 | F_k | 查询第k多的工资 |
_(下划线)表示一个空格,I命令、A命令、S命令中的k是一个非负整数,F命令中的k是一个正整数。
在初始时,可以认为公司里一个员工也没有。
分析
由于加减都是对所有员工进行的,可以直接维护一个全局变量。
发现扣除工资时,可能有多位员工离开公司。只要用fhq treap,直接按照权值split一下就可以了
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 100000
using namespace std;
int n,lim;
struct fhq_treap{
struct node{
int ls;
int rs;
int val;
int dat;
int sz;
int cnt;
}tree[maxn+5];
int ptr;
int xx,yy;
int root;
void push_up(int x){
tree[x].sz=tree[tree[x].ls].sz+tree[tree[x].rs].sz+tree[x].cnt;
}
int merge(int x,int y){//val[x]<=val[y]
if(x==0||y==0) return x+y;
if(tree[x].dat<tree[y].dat){
tree[x].rs=merge(tree[x].rs,y);
push_up(x);
return x;
}else{
tree[y].ls=merge(x,tree[y].ls);
push_up(y);
return y;
}
}
void split(int now,int k,int &x,int &y){//把值<=k的分出来
if(now==0){
x=y=0;
return;
}else{
if(k>=tree[now].val){
x=now;
split(tree[now].rs,k,tree[x].rs,y);
}else{
y=now;
split(tree[now].ls,k,x,tree[now].ls);
}
push_up(now);
}
}
int get_kth(int k){
int x=root;
while(1){
if(k<=tree[tree[x].ls].sz) x=tree[x].ls;
else if(k<=tree[tree[x].ls].sz+tree[x].cnt) return tree[x].val;
else{
k-=tree[tree[x].ls].sz+tree[x].cnt;
x=tree[x].rs;
}
}
return 0;
}
int New(int val){
ptr++;
tree[ptr].sz=tree[ptr].cnt=1;
tree[ptr].val=val;
tree[ptr].dat=rand();
return ptr;
}
void insert(int val){
split(root,val,xx,yy);
root=merge(xx,merge(New(val),yy));
}
int del(int val){
split(root,val,xx,yy);
root=yy;
return tree[xx].sz;
}
}T;
int delta;
char cmd[2];
int main(){
int x;
int ans=0;
scanf("%d %d",&n,&lim);
for(int i=1;i<=n;i++){
scanf("%s %d",cmd,&x);
if(cmd[0]=='I'){
if(x>=lim){
x-=delta;
T.insert(x);
}
}else if(cmd[0]=='A'){
delta+=x;
}else if(cmd[0]=='S'){
delta-=x;
ans+=T.del(lim-delta-1);
}else if(cmd[0]=='F'){
int all=T.tree[T.root].sz;
if(x>all) printf("-1\n");
else printf("%d\n",T.get_kth(all-x+1)+delta);
}
}
printf("%d\n",ans);
}
[BZOJ 1503]郁闷的出纳员(fhq treap)的更多相关文章
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- BZOJ 1503 郁闷的出纳员 (treap)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13370 Solved: 4808[Submit][Stat ...
- 洛谷 1486/BZOJ 1503 郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13866 Solved: 5069[Submit][Stat ...
- bzoj 1503郁闷的出纳员(splay)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 11759 Solved: 4163[Submit][Stat ...
- BZOJ 1503 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- BZOJ 1500 [NOI2005]维修数列 FHQ Treap
终于A了这题...这题还是很好...但是我太菜...重构了三遍qwq FHQ Treap大法好!qwq...~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n], ...
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
随机推荐
- JDK_1.8的Windows和Linux环境下的下载与安装
下载: Eclipse需要Jdk,MyEclipse有自带的Jdk 直接点击下载. Windows下JDK安装: 双击运行程序 下一步: 路径 更改到E:\Software\Java\jre1.8.0 ...
- JVM 垃圾回收(GC)机制
目录 一.背景 二. 哪些内存需要回收? 1.引用计数算法 2 .可达性分析算法 三. 四种引用状态 1.强引用 2.软引用 3.弱引用 4.虚引用 对象死亡(被回收)前的最后一次挣扎 方法区如何判断 ...
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...
- C++宽字符串转字符串
这文章是更改别人代码 #include <string> #include <iostream> #include <stdlib.h> #include < ...
- CreateProcessAsUser 服务调用
CreateProcessAsUser 函数 如果想通过服务向桌面用户Session 创建一个复杂UI 程序界面,则需要使用CreateProcessAsUser 函数为用户创建一个新进程用来运行相应 ...
- Android Studio使用阿里云Aliyun Maven仓库
如下所示,在build.gradle中添加Aliyun Maven仓库 // Top-level build file where you can add configuration options ...
- FM
1.FM (因子分解机) 2.FM的作用: (1)特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接进行建模,很可能会忽略掉特征与特征之间的关联信息,因此,可以通过构建新的交叉特征这一特征组合 ...
- 2018-08-01-weekly
Algorithm 4. Median of Two Sorted Arrays What 两个排序数组的中位数 How 两个数组合并到同一个数组,然后进行排序取中间值即可 Key Codes cla ...
- Django登录(含随机生成图片验证码)注册实例
登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...
- RPC的解释以及RPC和Restful、RPC和RMI的区别
如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...