BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
Description
Input
Output
Sample Input
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
Sample Output
20
-1
2
解题思路:
splay,维护懒惰标记。
splay支持删除子树,是比treap优秀的关键。
代码:
- #include<cstdio>
- #include<cstring>
- #include<cstring>
- #include<algorithm>
- #define lll tr[spc].ch[0]
- #define rrr tr[spc].ch[1]
- #define ls ch[0]
- #define rs ch[1]
- #define rrl tr[tr[root].rs].ls
- typedef long long lnt;
- struct trnt{
- int ch[];
- int fa;
- lnt lzt;
- lnt val;
- int wgt;
- int num;
- }tr[],str;
- int sta,fin;
- int root;
- int n;
- lnt m;
- int top;
- int siz=;
- char cmd[];
- int bin[];
- bool whc(int spc)
- {
- return tr[tr[spc].fa].rs==spc;
- }
- int del(int &spc)
- {
- bin[++top]=spc;
- int ans=tr[spc].wgt;
- spc=;
- return ans;
- }
- int newp(void)
- {
- if(top)
- {
- int spc=bin[top--];
- if(lll)
- del(lll);
- if(rrr)
- del(rrr);
- tr[spc]=str;
- return spc;
- }
- return ++siz;
- }
- void pushup(int spc)
- {
- tr[spc].wgt=tr[spc].num;
- if(lll)
- tr[spc].wgt+=tr[lll].wgt;
- if(rrr)
- tr[spc].wgt+=tr[rrr].wgt;
- return ;
- }
- void add(int spc,lnt v)
- {
- if(!spc)
- return ;
- tr[spc].val+=v;
- tr[spc].lzt+=v;
- return ;
- }
- void pushdown(int spc)
- {
- if(!spc)
- return ;
- if(tr[spc].lzt)
- {
- add(lll,tr[spc].lzt);
- add(rrr,tr[spc].lzt);
- tr[spc].lzt=;
- }
- return ;
- }
- void recal(int spc)
- {
- if(tr[spc].fa)
- recal(tr[spc].fa);
- pushdown(spc);
- return ;
- }
- void rotate(int spc)
- {
- int f=tr[spc].fa;
- bool k=whc(spc);
- tr[f].ch[k]=tr[spc].ch[!k];
- tr[spc].ch[!k]=f;
- tr[tr[f].fa].ch[whc(f)]=spc;
- tr[spc].fa=tr[f].fa;
- tr[f].fa=spc;
- tr[tr[f].ch[k]].fa=f;
- pushup(f);
- pushup(spc);
- return ;
- }
- void splay(int spc,int f)
- {
- recal(spc);
- while(tr[spc].fa!=f)
- {
- int ft=tr[spc].fa;
- if(tr[ft].fa==f)
- {
- rotate(spc);
- break;
- }
- if(whc(spc)^whc(ft))
- rotate(spc);
- else
- rotate(ft);
- rotate(spc);
- }
- if(!f)
- root=spc;
- return ;
- }
- int ansp;
- void kth(int spc,int k)
- {
- if(!spc)
- {
- ansp=-;
- return ;
- }
- pushdown(spc);
- if(tr[rrr].wgt>=k)
- return kth(rrr,k);
- if(tr[rrr].wgt+tr[spc].num>=k)
- {
- ansp=spc;
- return ;
- }
- return kth(lll,k-tr[spc].num-tr[rrr].wgt);
- }
- void maxmin(int spc,lnt v)
- {
- if(!spc)
- return ;
- pushdown(spc);
- if(tr[spc].val<v)
- {
- ansp=spc;
- return maxmin(rrr,v);
- }
- return maxmin(lll,v);
- }
- void minmax(int spc,lnt v)
- {
- if(!spc)
- return ;
- pushdown(spc);
- if(tr[spc].val>v)
- {
- ansp=spc;
- return minmax(lll,v);
- }
- return minmax(rrr,v);
- }
- int main()
- {
- scanf("%d%lld",&n,&m);
- root=;
- sta=;
- fin=;
- tr[]=(trnt){{,},,,-0x3f3f3f3f3f3f3f3fll,,};
- tr[]=(trnt){{,},,,0x3f3f3f3f3f3f3f3fll,,};
- int ans=;
- while(n--)
- {
- lnt x;
- scanf("%s",cmd+);
- scanf("%lld",&x);
- if(cmd[]=='I')
- {
- if(x<m)
- continue;
- maxmin(root,x);
- splay(ansp,);
- minmax(root,x);
- splay(ansp,root);
- if(rrl)
- {
- tr[rrl].num++;
- }else{
- rrl=newp();
- tr[rrl]=(trnt){{,},tr[root].rs,,x,,};
- }
- pushup(rrl);
- pushup(tr[root].rs);
- pushup(root);
- }else if(cmd[]=='A')
- {
- if(!x)
- continue;
- splay(sta,);
- splay(fin,root);
- add(rrl,x);
- }else if(cmd[]=='S')
- {
- splay(sta,);
- splay(fin,root);
- ansp=-;
- add(rrl,-x);
- minmax(rrl,m-);
- if(ansp==-)
- continue;
- splay(sta,);
- splay(ansp,root);
- if(!rrl)
- continue;
- ans+=del(rrl);
- pushup(tr[root].rs);
- pushup(root);
- }else{
- splay(sta,);
- splay(fin,root);
- kth(rrl,x);
- if(ansp==-)
- printf("%d\n",-);
- else
- printf("%lld\n",tr[ansp].val);
- }
- splay(sta,);
- splay(fin,root);
- ansp=-;
- minmax(rrl,m-);
- if(ansp==-)
- continue;
- splay(sta,);
- splay(ansp,root);
- if(!rrl)
- continue;
- ans+=del(rrl);
- pushup(tr[root].rs);
- pushup(root);
- }
- printf("%d\n",ans);
- return ;
- }
BZOJ1503: [NOI2004]郁闷的出纳员(Splay)的更多相关文章
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
- bzoj1503[NOI2004]郁闷的出纳员——Splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- NOI2004 郁闷的出纳员 Splay
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay
splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...
随机推荐
- Exchange2003迁移2010DAG的权限问题
exchange2010无法删除用户.在2010的控制台中新建一个通讯组.然后将它删除就会报告下面错误. MicrosoftExchange 错误:无法对对象"test"执行&qu ...
- SharePoint创建Alternate Access Mapping (AAM)备用訪问映射
SharePoint创建Alternate Access Mapping (AAM)备用訪问映射 SharePoint的仓库是SQL Server中的内容数据库.这些数据库储存着组织全 ...
- Python正则表达式初识(一)
首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式.正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候也十分常用,大家可以把它学的简单一些,但是不能不 ...
- 两种方法解决 "The License CNEKJPQZEX- has been cancelled..." 问题
今天在使用 2017 的 IDEA 和 Pycharm 等IDE的时候,提示了如题的问题.之前实在 http://idea.lanyus.com/ 网站点击生成注册码,复制粘贴到 IDEA 中就好了, ...
- python code 1_username registration & login
This tiny program consists of 2 parts - registration and login. In the part of registration, the key ...
- Linux中配置网桥
使用kvm虚拟机时,有时候需要自己添加网桥供guest使用. 不使用libvirt来管理的话,可以使用以下方法创建网桥并绑定到物理网卡(RHEL6/Fedora已实验): 1.创建网桥配置文件ifcf ...
- poj Transferring Sylla(怎样高速的推断一个图是否是3—连通图,求割点,割边)
Transferring Sylla 首先.什么是k连通图? k连通图就是指至少去掉k个点使之不连通的图. 题目: 题目描写叙述的非常裸.就是给你一张图要求你推断这图是否是3-连通图. 算法分析: / ...
- Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:在应用域,复合意味着 has-a. 在实现域.复合意味着 is-implemented ...
- 新辰:十种外链终极方法 让SEOer外链之路不再孤独!
大家都知道,外链就是指从别的站点导入到自己站点的链接.导入链接对于新辰站点优化来说是很重要的一个过程.因此,新辰觉得.对于中小型站点来说.外链但是优化的重中之重! 由于也有了"外链专员&qu ...
- selector-item属性
今天做的项目,发现通过键盘选中一个button以后,并没有出现button样式的变化,后来发现是selector里面缺少状态配置的原因.这里就顺便把用到的属性记录了下来,方便以后使用.当然它的属性很多 ...