BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503
题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动删除。四种操作:(1)数列中增加一个元素,设置初始值x;若x小于Min则不插入;(2)所有的元素增加一个值det;(3)所有的元素减小一个值det;此时有可能有一些会被删除(4)询问目前所有元素中第K大的。最后输出删除了多少个。
思路:首先,因为增加和减小是对所有元素而言,因此这个值我们不插入而是单独保存,设这个值为det。那么插入一个元素x,我们插入x-det,这样保持插入的所有元素的真实值都是其加上det。然后,每次减小时,我们需要进行删除,那么插入一个Min-det的节点,并将其调整到根节点,然后左子树就是被删除的。之后,将根节点的右节点变为根节点。
int tot,root,k[N],L[N],R[N],f[N],s[N];
inline void pushUp(int x)
{
if(x) s[x]=s[L[x]]+s[R[x]]+1;
}
inline void zig(int x)
{
int y=f[x],z=f[y];
if(z) L[z]==y?L[z]=x:R[z]=x;
f[x]=z;
L[y]=R[x];
if(R[x]) f[R[x]]=y;
R[x]=y;
f[y]=x;
pushUp(y);
pushUp(x);
}
inline void zag(int x)
{
int y=f[x],z=f[y];
if(z) L[z]==y?L[z]=x:R[z]=x;
f[x]=z;
R[y]=L[x];
if(L[x]) f[L[x]]=y;
L[x]=y;
f[y]=x;
pushUp(y);
pushUp(x);
}
inline void splay(int x)
{
int y;
while(y=f[x])
{
if(f[y])
{
if(L[f[y]]==y) L[y]==x?(zig(y),zig(x)):(zag(x),zig(x));
else R[y]==x?(zag(y),zag(x)):(zig(x),zag(x));
}
else L[y]==x?zig(x):zag(x);
}
root=x;
}
inline void insert(int key)
{
int x=root,y=0;
for(;x;y=x,x=key<=k[x]?L[x]:R[x]);
k[x=++tot]=key;
if(y) key<=k[y]?L[y]=x:R[y]=x;
f[x]=y; s[x]=1; splay(x);
}
inline int select(int K)
{
int x=root;
for(;s[L[x]]+1!=K;K<=s[L[x]]?x=L[x]:(K-=s[L[x]]+1,x=R[x]));
splay(x);
return k[x];
}
int main()
{
int n,m,d=0,ans=0;
RD(n,m);
while(n--)
{
char op[10];
int x;
scanf("%s%d",op,&x);
if(op[0]=='I'&&x>= m) insert(x-d);
else if(op[0]=='A') d+=x;
else if(op[0]=='S')
{
insert(m-(d-=x));
ans+=s[L[root]]; root=R[root]; f[root]=0;
pushUp(root);
}
else if(op[0]=='F') PR(x>s[root]?-1:select(s[root]-x+1)+d);
}
PR(ans);
return 0;
}
转载于:https://www.cnblogs.com/jianglangcaijin/p/3458169.html
BZOJ 1503 郁闷的出纳员(splay)相关推荐
- bzoj 1503 郁闷的出纳员 (平衡树+前缀和)
题意 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资. ...
- HYSBZ - 1503 郁闷的出纳员(Splay)
题目链接:点击查看 题目大意:中文题 题目分析:利用Splay加一点思维还是比较容易解决的,对于所有员工加工资以及减工资的操作,别看只有100次,如果是暴力修改的话,时间复杂度能达到1e7,常数稍大点 ...
- 950. 郁闷的出纳员(Splay树)
OIER 公司是一家大型专业化软件公司,有着数以万计的员工. 作为一名出纳员,我的任务之一便是统计每位员工的工资. 这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资. ...
- 郁闷的出纳员(splay, 树状数组可做)
题面 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如 ...
- HYSBZ 1503 郁闷的出纳员 伸展树
题目链接: https://vjudge.net/problem/26193/origin 题目描述: 中文题面....... 解题思路: 伸展树, 需要伸展树的模板, 突然发现自己昨天看到的模板不是 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 Treap
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- HNOI2004 郁闷的出纳员(Splay)
郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- 【BZOJ1503】郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 11250 Solved: 3962 [Submit][St ...
最新文章
- 问题小结(一)——servlet生命周期、get和post请求、内置对象、单例模式等
- linux-shell命令之chmod(change mode)【更改权限】
- WCF、WebAPI、WebService之间的区别
- el-autocomplete判空校验时,第一次点击不通过,再次点击才正常
- 复制release文件到另一台电脑.exe文件无法运行_电脑技巧:电脑版微信双开(或微信多开)?用start指令可以解决...
- .net 下URL重写
- C# interview questions--- 国外大公司c#技术面试必看(总结贴一)
- python-获取当前文件名
- DEV CPP中使用Clang
- 微信商户收款码在哪里下载 -PC端
- 程序员分哪几种,分别薪资是多少
- 1、电脑鼠标右键反应慢,解决办法
- 6.2.1邻接矩阵法
- 易语言解析ip138.com的查询接口
- 网游“梦幻西游”“my.exe”在Win7(或XP)下出现“已停止工作”报错无法运行的解决方法
- ben we_老WE成立手游战队!2020LOL冬季转会汇总:截止11月17日(每日更新)
- | UML(Jude)
- C语言二分查找算法[基础算法]
- 构建中小型企业内部网络
- List数组去重的几种方法
热门文章
- Nginx学习2:Nginx的安装配置和常用命令
- 通关制单机器人_2020关务节|“数字供应链与智能通关”论坛——如何打造云上跨境贸易生态圈...
- 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
- Ant Design of React从入门到开发教程
- 微信小程序获取用户设备的信息
- [微信小程序]滚动选择器
- 开源一个上架 App Store 的相机 App
- 一次奇怪的AP注册异常问题处理
- 开源大数据周刊-第11期
- EffectKeyMap系列1(Ubuntu)