BZOJ1503: [NOI2004]郁闷的出纳员(洛谷P1486)
来源:互联网 发布:小孩刘心悠原帖知乎 编辑:程序博客网 时间:2024/06/14 07:23
平衡树
BZOJ题目传送门
洛谷题目传送门
显然用平衡树维护(然而有大佬用了线段树)。插入、查询、删除平衡树都可以支持,但是这里的加减操作有点不常规,我们需要进行转化一下。
新建一个变量表示当前工资下限,那么加工资就变成了减工资下限,减工资就变成了加工资上限。新建节点时需要把工资加上(当前工资下限-原来工资下限),输出时也要减掉。这样就不需要麻烦地打标记。
这里给出Treap的代码:
#include<cstdio>#include<cstdlib>#define N 100000using namespace std;struct node{ int w,p,size,rnd,to[2];}t[N+5];int n,m,rt,nd,wg,ans;void rtt(int &x,int fl){ int s=t[x].to[fl]; t[x].to[fl]=t[s].to[fl^1]; t[s].to[fl^1]=x; t[s].size=t[x].size; t[x].size=t[t[x].to[0]].size+t[t[x].to[1]].size+t[x].p; x=s; return;}void nsrt(int &x,int w){ if (!x){ t[x=++nd].w=w; t[x].size=t[x].p=1; t[x].rnd=rand(); return; } t[x].size++; if (t[x].w==w) t[x].p++; else{ int flag=t[x].w<w; nsrt(t[x].to[flag],w); if (t[x].rnd>t[t[x].to[flag]].rnd) rtt(x,flag); }}void dlt(int &x,int w){ if (!x) return; if (t[x].w==w){ if (t[x].p>1) { t[x].p--; t[x].size--; return; } if (!(t[x].to[0]*t[x].to[1])) x=t[x].to[0]+t[x].to[1]; else if (t[t[x].to[0]].rnd<t[t[x].to[1]].rnd) rtt(x,0),dlt(x,w); else rtt(x,1),dlt(x,w); } else{ t[x].size--; if (t[x].w<w) dlt(t[x].to[1],w); else dlt(t[x].to[0],w); }}int srch_nm(int x,int w){ if (!x) return -1; if (t[t[x].to[0]].size>=w) return srch_nm(t[x].to[0],w); if (t[t[x].to[0]].size+t[x].p>=w) return t[x].w-wg+m; return srch_nm(t[x].to[1],w-t[t[x].to[0]].size-t[x].p);}int srch_frnt(int x,int w){ if (!x) return -0x7fffffff; if (t[x].w<w){ int k=srch_frnt(t[x].to[1],w); if (k!=-0x7fffffff) return k; else return t[x].w; } else return srch_frnt(t[x].to[0],w);}int main(){ scanf("%d%d",&n,&m); wg=m; while (n--){ int x; char s[5]; scanf("%s%d",&s,&x); switch (s[0]){ case 'I': if (x+wg-m>=wg) nsrt(rt,x+wg-m); break; case 'A': wg-=x; break; case 'S': wg+=x; break; case 'F': x=t[rt].size-x+1,printf("%d\n",srch_nm(rt,x)); break; } int p=srch_frnt(rt,wg); while (p!=-0x7fffffff) dlt(rt,p),p=srch_frnt(rt,wg),ans++; } return printf("%d\n",ans),0;}
阅读全文
1 0
- BZOJ1503: [NOI2004]郁闷的出纳员(洛谷P1486)
- bzoj1503 [NOI2004]郁闷的出纳员(splay)
- [bzoj1503][NOI2004]郁闷的出纳员
- BZOJ1503【NOI2004】郁闷的出纳员
- [BZOJ1503][NOI2004]郁闷的出纳员
- bzoj1503【NOI2004】郁闷的出纳员
- [BZOJ1503] [NOI2004]郁闷的出纳员
- 【bzoj1503】[NOI2004]郁闷的出纳员
- 【BZOJ1503】[NOI2004]郁闷的出纳员
- bzoj1503: [NOI2004]郁闷的出纳员
- BZOJ1503: [NOI2004]郁闷的出纳员
- 【bzoj1503】[NOI2004]郁闷的出纳员
- 【bzoj1503】 [NOI2004]郁闷的出纳员
- bzoj1503: [NOI2004]郁闷的出纳员
- BZOJ1503: [NOI2004]郁闷的出纳员
- 平衡二叉树SBT(BZOJ1503[NOI2004]郁闷的出纳员)
- [BZOJ1503][NOI2004]郁闷的出纳员(平衡树splay)
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
- java的关键字和保留字
- Foul Play UVA
- EEPROM_IIC
- mysql数据库的使用及查询语句
- 自话遗传算法(带实例)
- BZOJ1503: [NOI2004]郁闷的出纳员(洛谷P1486)
- 在Visual Sutdio 2017中使用boost库
- 【学习C++】C++项目的头文件和实现文件分别写什么
- nyoj 99 单词拼接(欧拉图)
- Recycler点击事件_接口回调
- python3学习-logging模块
- 二分法查找(C)
- Craigslist :一个神奇的网站
- Ubuntu 15.04安装Beyond Compare并添加右键对比菜单