题目大意:
现在有n个操作和一个最低限度m

\(I\)命令\(I\ k\)新建一个工资档案,初始工资为k。
\(A\)命令$A k $把每位员工的工资加上k

\(S\)命令$S k $把每位员工的工资扣除k

\(F\)命令$ F k\(查询第k多的工资 (如果当前的员工总数不够k,就输出\)-1$)

其中\(n \le 100000\)

最后还要输出最终离开了多少个员工

需要注意的是 ,如果某员工的初始工资低于工资下界,他将立刻离开公司!!!!

一看这个题,就感觉是个\(splay\)了

不过emmmm 这个整体加和整体减应该怎么弄呢

我们考虑维护一个整体的变化值\(tmp\)

那么对于splay中的每个元素,它的实际权值就是\(x+tmp\)

这么来说

对于\(I\)操作,如果它的权值\(>\)m,则\(insert(x-tmp)\)

对于\(A\)操作,直接\(tmp+=x\)

对于\(S\)操作,我们让\(tmp-=x\),并且判断有没有需要退出的点(就是直接将\(-inf\)转到\(root\),然后把\(min1-tmp-1\)的后继转到root的右儿子,删掉左儿子)这样做的原因是避免哨兵被删掉

对于\(F\)操作,那就直接返回第k大,然后\(+tmp\)就可以

代码还是有很多细节的,比如要维护当前平衡树中有几个元素,事先加入哨兵之类的,直接看代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<vector>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 1e6+1e2;int ch[maxn][4];
int val[maxn],sz[maxn],size;
int fa[maxn];
int cnt[maxn];
int n,m,ymh,root,min1;
int tot;
int num=0;
int ans;int son(int x)
{if (x==ch[fa[x]][0]) return 0;else return 1;
}
void update(int x)
{sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
}void rotate(int x)
{int y=fa[x],z=fa[y];int b=son(x),c=son(y);ch[z][c]=x;fa[x]=z;ch[y][b]=ch[x][!b];fa[ch[x][!b]]=y;ch[x][!b]=y;fa[y]=x;update(y);update(x);
}void splay(int x,int p)
{while (fa[x]!=p){int y=fa[x],z=fa[y];if (z==p) rotate(x);else{if (son(x)==son(y)){rotate(y);rotate(x);}else{rotate(x);rotate(x);}}}if (fa[x]==0) root=x;
}int find_qq(int x)
{int now = root,num=0;while (now){if (val[now]<x){num=now;now=ch[now][1];}else now=ch[now][0];}return num;
}int find_hj(int x)
{int now = root,num=0;while (now){if (val[now]>x){num=now;now=ch[now][0];}else now=ch[now][1];}return num;
}void insert(int x)
{tot++;int qq = find_qq(x);int hj = find_hj(x);splay(qq,0);splay(hj,qq);int y = ch[hj][0];if (cnt[y]){cnt[y]++;update(y);}else{++size;ch[hj][0]=size;fa[size]=hj;val[size]=x;cnt[size]=1;sz[size]=1;//cout<<"gg11"<<endl;update(size);}
}void delet(int x)
{--tot;int qq = find_qq(x);int hj = find_hj(x);splay(qq,0);splay(hj,qq);int y = ch[hj][0];if (cnt[y]>1){cnt[y]--;update(y);}else{cnt[y]=0;fa[y]=0;ch[hj][0]=0;sz[y]=0;val[y]=0;   }
}int kth(int x)
{int now = root;while (1){if (x<=sz[ch[now][0]]) now=ch[now][0];else{if (x<=sz[ch[now][0]]+cnt[now]) return val[now];x-=sz[ch[now][0]]+cnt[now];now=ch[now][1]; }}
}int add;int main()
{size=2;val[1]=2e9;val[2]=-2e9;fa[2]=1;ch[1][0]=2;root=1;scanf("%d%d",&n,&min1);for (int i=1;i<=n;i++){char s[10];int x;scanf("%s",s+1);//cout<<size<<endl;x=read();//cout<<x<<endl;if (s[1]=='A'){ymh+=x;}if (s[1]=='S'){ymh-=x;int hj = find_hj(min1-ymh-1);splay(2,0);splay(hj,2);int pos = ch[hj][0];ans+=sz[pos];tot-=sz[pos];fa[pos]=0;ch[hj][0]=0;sz[pos]=0;cnt[pos]=0;/*if (tot==0) {size=2;val[1]=2e9;val[2]=-2e9;fa[2]=1;ch[1][0]=2;root=1;}*///cout<<ans;}if (s[1]=='I'){if (x<min1) continue;//cout<<"gg"<<endl;insert(x-ymh);}if (s[1]=='F'){//cout<<tot<<endl;if (x>tot)printf("-1\n");elseprintf("%d\n",kth(tot-x+1)+ymh); }//cout<<tot<<endl;}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/yimmortal/p/10160798.html

bzoj1503 郁闷的出纳员(平衡树,思维)相关推荐

  1. [bzoj2733]永无乡 [bzoj1503]郁闷的出纳员

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1321  Solved: 693 [Submit][Stat ...

  2. [BZOJ1503]郁闷的出纳员(Splay)

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

  3. bzoj1503 郁闷的出纳员

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

  4. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

  5. 【BZOJ1503】郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 11250  Solved: 3962 [Submit][St ...

  6. [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  7. bzoj1503: [NOI2004]郁闷的出纳员

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题目: 1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  ...

  8. HNOI2004 郁闷的出纳员(Splay)

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

  9. 洛谷P1486 [NOI2004] 郁闷的出纳员 题解

    P1486 [NOI2004] 郁闷的出纳员 题目链接:P1486 [NOI2004] 郁闷的出纳员 题意:维护一个数据结构,支持 插入一个大小为 kkk​ 的值,小于下界时不插入 所有元素加上 kk ...

最新文章

  1. Jquery UI dialog 详解 (中文)
  2. opengl正方形绕点旋转_中考热点:再说旋转动点问题中的最值问题之提分攻略
  3. linux检测远程端口是否打开
  4. 用linux装逼-我的vim配置(不定时更新)
  5. 这几天又看了Gosu,发现也是蛮有意思
  6. Linux:批量清空当前目录下的日志文件
  7. 高考还没结束,这份试卷已经流出,你能拿多少分?
  8. 国科大学习资料--矩阵分析与应用(李保滨)--2017年期末考试试卷
  9. 简单sql存储过程实例、储过程实战
  10. mac安装yarn的方法
  11. c语言实验作业感想,c语言程序报告实验总结(共10篇).docx
  12. 【独家分享】QQ常见网络骗术***战
  13. 天牛群,天牛须结合粒子群算法BAS-PSO。研究生阶段毕生所 学,低价出售!可定制pid参数整定。
  14. android studio秘钥库文件不存在,获得SHA1以及错误java.lang.Exception: 密钥库文件不存在: keystore...
  15. 0x7c97cdf2指令引用的0x00000014内存。该内存不能为”written
  16. HTML学生个人网站作业设计:电影网站设计——电影资讯博客(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  17. 使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了
  18. 压缩感知(Compressed Sensing)
  19. 论文笔记:Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World
  20. jQuery知识点大全

热门文章

  1. python学习--DAY2
  2. 码云机房今晨出现网络故障,已经恢复
  3. 《树莓派Python编程入门与实战(第2版)》——3.9 小结
  4. (一)SOA学习-相关缩写
  5. CF1019E Raining season
  6. SharePoint 2013 新建网站集图解
  7. (转)Mac下MySql安装经历(含安装错误排查、卸载多种折腾)
  8. Apache 'mod_accounting'模块SQL注入漏洞(CVE-2013-5697)
  9. Linux平台Qt creator报错:Circular all - first dependency dropped
  10. NoSQL 之 Morphia 操作 MongoDB