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 && ...
随机推荐
- jdk8-日期
今天遇到了日期问题,看了下jdk8新特性 http://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html Java 的 ...
- ubuntu在命令行新建用户后无法进入桌面的原因
在命名行模式下 用useradd新建一个用户后 在图形界面输入密码无法登陆 这是因为未对新建的用户进行任何配置 用adduser命令新建用户即可进入桌面 下面说一下useradd 和 adduser的 ...
- HTML 学习笔记 JavaScript (函数)
函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> func ...
- shipyard安装
1.Start an data volume instance of RethinkDB: # docker run -it -d --name shipyard-rethinkdb-data \ - ...
- Centos下Apache使用Symlink访问外部目录出现403
在Aapche 的document root 下创建软链到其他目录时, 无法从浏览器访问, 返回403错误. 主要检查两点: 1. 软链目标目录的每一级, 都要对所有人开放执行权限, 即对各级目录 c ...
- html代码中显示系统时间
可以显示系统的静态时间和动态时间 1,静态时间 <script type="text/javascript"> var myDate = new Date(); doc ...
- 学习jQuery的on事件
开发asp.net mvc程序,多少是离不开jQuery客户程序.今天Insus.NET学习jQuery的一个on事件驱动. 先在网页视图放一个图片铵钮,用户可以使用mouse对这图片时行over,o ...
- Javascript的ArrayBuffer从Utf8ArrayToString
由于项目需要,需要从一个已知的ArrayBuffer中读取出字符串,虽然环境是typescript,但最终还是用的js的代码改了一下解决, public Utf8ArrayToStr(array):s ...
- lodop打印控件一点记录
今天初步接触了下打印控件 LODOP实现了自动分页,高度宽度都可以自己设定来分页. 页码,使用LODOP.SET_PRINT_STYLE("ItemType", 2); LODOP ...
- 我在 CSDN 的小窝
以后有文章,我会同时更新 博客园 和 CSDN. CSDN:http://blog.csdn.net/u010918003