bzoj1503
treap改了好长时间,erase写错了。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int inf=<<;
int n,mn,root,delta,tot,leave;
int key[],cnt[],size[],p[];
int child[][];
void update(int x)
{
size[x]=size[child[x][]]+size[child[x][]]+cnt[x];
}
void rotate(int&x,int t)
{
int y=child[x][t];
child[x][t]=child[y][-t];
child[y][-t]=x;
update(x);
update(y);
x=y;
}
void insert(int&x,int k)
{
if(x)
{
if(key[x]==k)
{
cnt[x]++;
update(x);
return;
}
int t=key[x]<k;
insert(child[x][t],k);
if(p[x]<p[child[x][t]]) rotate(x,t);
update(x);
}
else
{
tot++;
x=tot;
p[x]=rand();
key[x]=k;
cnt[x]=;
update(x);
}
}
void erase(int&x,int k)
{
if(key[x]==k)
{
if(!child[x][]&&!child[x][])
{
x=;
return;
}
int t=p[child[x][]]>p[child[x][]];
rotate(x,t);
erase(child[x][t^],k);
} else erase(child[x][key[x]<k],k);
update(x);
}
void _erase(int x)
{
if(x==) return;
if(key[x]+delta<mn)
{
leave+=cnt[x];
if(key[child[x][]]+delta<mn)
{
leave+=size[child[x][]];
child[x][]=;
update(x);
}
_erase(child[x][]);
erase(root,key[x]);
}
_erase(child[x][]);
}
int find(int x,int k)
{
if(k<=size[child[x][]])
return find(child[x][],k);
k-=size[child[x][]]+cnt[x];
if(k<=)
return key[x];
return find(child[x][],k);
}
int main()
{
p[]=-inf;
scanf("%d%d",&n,&mn);
while(n--)
{
char s[]; int k; scanf("%s%d",s,&k);
if(s[]=='I')
{
if(k>=mn)
insert(root,k-delta);
}
if(s[]=='A')
{
delta+=k;
}
if(s[]=='S')
{
delta-=k;
_erase(root);
}
if(s[]=='F')
{
if(k>size[root]) printf("-1\n"); else
printf("%d\n",find(root,k)+delta);
}
}
printf("%d\n",leave);
return ;
}
splay
#include<cstdio>
#include<cstring>
using namespace std;
struct data
{
int fa,l,r,size,cnt,key;
}tree[];
int root,n,tot,ans;
int abs(int x)
{
return x>?x:-x;
}
void update(int x)
{
tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+tree[x].cnt;
}
void zig(int x)
{
int y=tree[x].fa;
int z=tree[x].r;
tree[y].l=z;
tree[z].fa=y;
tree[x].fa=tree[y].fa;
if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
else tree[tree[y].fa].r=x;
tree[x].r=y;
tree[y].fa=x;
update(x);
update(y);
}
void zag(int x)
{
int y=tree[x].fa;
int z=tree[x].l;
tree[y].r=z;
tree[z].fa=y;
tree[x].fa=tree[y].fa;
if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
else tree[tree[y].fa].r=x;
tree[x].l=y;
tree[y].fa=x;
update(x);
update(y);
}
void splay(int x)
{
if(!root)
{
root=x;
return;
}
while(tree[x].fa)
{
int y=tree[x].fa;
int z=tree[y].fa;
if(y==root)
{
if(x==tree[root].l) zig(x); else zag(x);
update(x);
break;
}
else if(y==tree[z].l&&x==tree[y].l) {zig(y); zig(x);}
else if(y==tree[z].r&&x==tree[y].r) {zag(y); zag(x);}
else if(y==tree[z].l&&x==tree[y].r) {zag(x); zig(x);}
else if(y==tree[z].r&&x==tree[y].l) {zig(x); zag(x);}
update(x);
}
root=x;
}
void insert(int x,int k)
{
if(tree[x].key==k)
{
tree[x].cnt++;
update(x);
splay(x);
}
else if(tree[x].key<k)
{
if(tree[x].r==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].r=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
splay(tot);
return;
}
insert(tree[x].r,k);
update(x);
}
else if(tree[x].key>k)
{
if(tree[x].l==)
{
++tot;
tree[tot].fa=x;
if(x) tree[x].l=tot;
tree[tot].key=k;
tree[tot].cnt=;
update(tot);
splay(tot);
return;
}
insert(tree[x].l,k);
update(x);
}
}
int search(int x,int k)
{
if(tree[x].key==k) return x;
if(tree[x].key<k) return search(tree[x].r,k);
if(tree[x].key>k) return search(tree[x].l,k);
}
void findnxt(int x,int k,int pd)
{
if(x==) return;
if(pd==)
{
if(tree[x].key<k)
{
ans=x;
findnxt(tree[x].r,k,pd);
} else findnxt(tree[x].l,k,pd);
}
else
{
if(tree[x].key>k)
{
ans=x;
findnxt(tree[x].l,k,pd);
} else findnxt(tree[x].r,k,pd);
}
} void erase(int x)
{
findnxt(root,x,);
int pos=search(root,x);
splay(pos);
if(tree[pos].cnt>)
{
tree[pos].cnt--;
update(pos);
splay(pos);
return;
}
if(ans==)
{
root=tree[pos].r;
tree[root].fa=;
return;
}
if(tree[x].r==)
{
root=tree[x].l;
tree[root].fa=;
return;
}
// printf("%d %d\n",pos,pro);
tree[tree[pos].r].fa=ans;
tree[tree[pos].l].fa=;
root=tree[pos].l;
tree[ans].r=tree[pos].r;
splay(ans);
ans=;
}
int findrank(int x)
{
int pos=search(root,x);
splay(pos);
return tree[tree[pos].l].size+;
}
int find(int x,int k)
{
int y=tree[x].l;
int z=tree[x].r;
if(k<=tree[z].size) return find(z,k);
// printf("%d %d\n",tree[x].cnt,tree[z].size);
k-=tree[z].size+tree[x].cnt;
if(k<=) return tree[x].key;
return find(y,k);
}
int main()
{
scanf("%d",&n);
while(n--)
{
int opt,x; scanf("%d%d",&opt,&x);
if(opt==)
{
insert(root,x);
}
if(opt==)
{
erase(x);
}
if(opt==)
{
printf("%d\n",findrank(x));
}
if(opt==)
{
printf("%d\n",find(root,x));
}
if(opt==)
{
findnxt(root,x,opt);
printf("%d\n",tree[ans].key);
ans=;
}
if(opt==)
{
findnxt(root,x,opt);
printf("%d\n",tree[ans].key);
ans=;
}
}
return ;
}
bzoj1503的更多相关文章
- 【bzoj1503】 NOI2004—郁闷的出纳员
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题目链接) 题意 要求维护4种操作:插入一个数,将所有数加上k,将所有数减去k,删去数值小于 ...
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- Splay初步【bzoj1503】
做了一道水题,把bzoj1503用Splay重新写了一下. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
- 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)
bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...
- bzoj1503郁闷的出(cheng)纳(xu)员
好痛苦,,,WA了不知道多少遍 错的服了,,, 如果某员工的初始工资低于工资下界,他将立刻离开公司 我也不知道是我语文有问题还是题目有毒,反正这个东西好像不应该算在离开公司的总人数的答案里... 让我 ...
- 【BZOJ1503】[HAOI2007]反素数ant 搜索
结论题...网上讲的好的很多... #include <iostream> using namespace std; ]={,,,,,,,,,},num=; long long ans,n ...
- BZOJ1503——郁闷的出纳员
1.题目大意:一道treap题,支持插入,询问第K大,还有全体修改+上一个值,如果某个点值小于x,那么就删除这个点 插入100000次,询问100000次,修改100次..最后输出删了多少个点 2.分 ...
- 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay
splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...
随机推荐
- NOIP2014pj子矩阵[搜索|DP]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 使用C#向ACCESS中插入数据
使用C#向ACCESS中插入数据 1.创建并打开一个OleDbConnection对象 string strConn = " Provider = Microsoft.Jet.OLEDB ...
- jmeter 中的 HTTP URL Re-writing Modifier
URL rewriting modifier,因为tomcat的session实现不是通过cookie的,而是通过session id的,就是说,用户登录有了session之后,tomcat就会维护一 ...
- android listView嵌套gridview的使用心得
在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...
- Android中如何设置RadioButton在文字的右边,图标在左边
from:http://blog.csdn.net/sunnyfans/article/details/7901592?utm_source=tuicool&utm_medium=referr ...
- Eclipse中启用Oracle jdbc logging
根据自己用的JRE版本, jre1.5选择ojdbc5_g.jar, jre6选择ojdbc6_g.jar, 只有带_g的dirver才输出debug信息. maven 的配置信息: <depe ...
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- [LINK]Scribe
http://www.361way.com/scribe-chukwa-kafka-flume/4119.html
- nfs客户端报错解决Stale file handle
NFS故障: 场景:客户端挂载是好的.服务端磁盘满了,重新给挂了一快.客户端df -h nfs挂载消失. 客户端报错:Stale file handle 现象如下: [root@test63-spri ...
- Android之捕获TextView超链接
应该是好久没有写有关技术类的文章了,今天分享一篇捕获TextView超链接的文章,希望对大家有所帮助,我终于在歪路上回归正途了.这个捕获TextView超链接应该算是比较常用吧,如果你会了,就不用看了 ...