[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. Spark 计算人员二度关系

    1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...

  2. 【转】SIP协议 会话发起协议

    转自:https://www.cnblogs.com/gardenofhu/p/7299963.html 会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协 ...

  3. Java性能调优工具(Linux)

    为了能准确获得程序的性能信息,需要使用各种辅助工具.以下主要介绍了Linux上关于Java的系统性能分析工具,掌握这些工具,对于性能瓶颈定位.系统故障排查都有帮助. 1.top命令 [root@loc ...

  4. 安装kafka多节点

    安装多节点的kafka只需要创建多份配置文件(server.properties),然后指定他们启动kafka服务即可,本例中采用一台服务器来模拟3个节点的kafka集群搭建.同理,使用一台服务器搭建 ...

  5. 前端自动化gulp使用方法

    gulp介绍 1. 网站: http://slides.com/contra/gulp#/ 2. 特点 易于使用:通过代码优于配置的策略, Gulp 让简单的任务简单,复杂的任务可管理. 构建快速 : ...

  6. Windows电脑无法识别USB设备怎么办?

    您可能已经注意到,如果您使用USB设备并将其插入计算机,Windows会识别并配置它.然后,如果你拔掉它并将其重新插入另一个USB端口,Windows就会出现一连串的健忘症,并认为这是一个完全不同的设 ...

  7. 卷积神经网络(Text--cnn)(知识点整理)

    参考:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ 独热编码(one- ...

  8. vue中的render函数介绍

    简介:对于不了解slot的用法(参考:大白话vue-slot的用法)又刚接触render函数的同学来说,官网的解释无疑一脸懵逼,这里就整理下个人对render函数的理解 问题: 1.render函数是 ...

  9. pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决

    最近正在迭代开发的一个项目编译安装时出现报“package com.sun.crypto.provider does not exist”的错误,由于本人能力水平有限,也是第一次遇到该问题,来来回回折 ...

  10. 给网页标题添加icon小图标

    so easy: 给网页标题添加icon小图标: 直接在html文件的head部分添加下面代码(注意href的路径): <link rel="icon" type=" ...