[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)的更多相关文章

  1. 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap

    思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...

  2. BZOJ 1503 郁闷的出纳员 (treap)

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

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

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

  4. bzoj 1503郁闷的出纳员(splay)

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

  5. BZOJ 1503 郁闷的出纳员

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

  6. BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...

  7. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  8. BZOJ 1500 [NOI2005]维修数列 FHQ Treap

    终于A了这题...这题还是很好...但是我太菜...重构了三遍qwq FHQ Treap大法好!qwq...~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n], ...

  9. 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码

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

随机推荐

  1. 自定义、操作cookie

    /** * 读取所有cookie * 注意二.从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交.浏览器提交Cookie时只会提交name与value属性.maxAg ...

  2. ffmpeg知多少~~~

    一.ffmpeg安装: https://jingyan.baidu.com/article/f7ff0bfcd64cea2e26bb1334.html   二.ffmpeg视频处理(包括各种视频流处理 ...

  3. Sql中使用Case when

    SELECT CASE WHEN Column IS NOT NULL THEN '情况1' ELSE '情况2' END AS '列名' , FROM dbo.Table

  4. HDU-3810 超大容量01背包

    题意:有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆.最后问在满足打的金钱多余m的情况下的最少时间.数据范 ...

  5. CSS3 Animations

    CSS Animations 是CSS的一个模块,它定义了如何用关键帧来随时间推移对CSS属性的值进行动画处理.关键帧动画的行为可以通过指定它们的持续时间,它们的重复次数以及它们如何重复来控制. an ...

  6. TOJ 4105 Lines Counting (树状数组)

    题意:给定N条线段,每条线段的两个端点L和R都是整数.然后给出M个询问,每次询问给定两个区间[L1,R1]和[L2,R2],问有多少条线段满足:L1≤L≤R1 , L2≤R≤R2 ? 题解,采用离线做 ...

  7. randomForest R 学习笔记

    object type randomForest 会根据变量的类型来决定regression或classification.class(iris$Species)是 factor,所以是classif ...

  8. [BZOJ] 书堆

    问题描述 蚂蚁是勤劳的动物,他们喜欢挑战极限?现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边緣.蚂蚁喜欢整洁的布置,所以 ...

  9. C# 获取路径中,文件名、目录、扩展名等

    string path = "C:\\dir1\\dir2\\foo.txt"; string str = "GetFullPath:" + Path.GetF ...

  10. Node对象的一些方法

    Node对象是什么提供了 DOM的标准规范提供了Node对象,该对象主要提供了解析DOM节点树结构的属性和方法,DOM树结构主要是依靠节点进行解析,称为DOM节点树结构.Node对象是解析DOM节点树 ...