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 && ...
随机推荐
- u3d_小游戏_拼图_1_生成碎片(非随机)
http://blog.csdn.net/cube454517408/article/details/7907247 首先是参考此文: main.cs作用:1.大图的拆分 2.判断是否成功 3.对碎 ...
- Maven学习(四)Maven 命令行选项
说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:describe -Dcmd=compiler:co ...
- 嵌入式linux根文件系统制作
编译Busybox 从http://www.busybox.net/downloads/下载busybox工具.这里我们下载的上最新版: busybox-1.24.2.tar.bz2 解压Busybo ...
- java 22 - 5 多线程之获取和设置线程对象的名称
如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String n ...
- 转:GCC,LLVM,Clang编译器对比
GCC,LLVM,Clang编译器对比 转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...
- Eclipse tooltip变黑的修正
- nmap脚本扫描使用总结
nmap的脚本默认目录为:/usr/share/nmap/scripts/ Nmap提供的命令行参数如下 -sC: 等价于--script=default,使用默认类别的脚本进行扫描 可更换其他类别 ...
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...
- php多进程刷票
$processNum=20; for($i=1;$i<=$processNum;$i++){ $pid=pcntl_fork(); if($pid==-1){ //todo log }else ...
- Javascript中document.execCommand()的用法
document.execCommand()方法处理Html数据时常用语法格式如下:document.execCommand(sCommand[,交互方式, 动态参数]) 其中:sCommand为指令 ...