HNOI2004 宠物收养所 (平衡二叉树)
平衡树基础题,用于测试各种平衡树的性能(雾)
treap:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct Treap {
static const int N=1e5+;
int rnd() {static int seed=time()%0x7fffffff; return seed=seed*48271ll%0x7fffffff;}
int ch[N][],siz[N],val[N],fa[N],tot,rd[N];
int rel(int u) {return ch[fa[u]][]==u;}
void init() {tot=fa[]=ch[][]=ch[][]=siz[]=val[]=rd[]=;}
int newnode(int x) {
int u=++tot;
fa[u]=ch[u][]=ch[u][]=;
siz[u]=,val[u]=x,rd[u]=rnd();
return u;
}
void pu(int u) {siz[u]=siz[ch[u][]]+siz[ch[u][]]+;}
void rot(int u) {
int v=fa[u],f=rel(u),ff=rel(v);
ch[v][f]=ch[u][f^],fa[ch[v][f]]=v;
ch[u][f^]=v,fa[u]=fa[v],fa[v]=u;
if(fa[u])ch[fa[u]][ff]=u;
pu(v),pu(u);
}
void ins(int& rt,int u) {
if(!rt) {rt=u; return;}
int v;
for(v=rt; ch[v][val[u]>=val[v]]; v=ch[v][val[u]>=val[v]]);
ch[v][val[u]>=val[v]]=u,fa[u]=v;
for(; fa[u]&&rd[u]<rd[fa[u]]; rot(u));
if(!fa[u])rt=u;
for(u=fa[u]; u; u=fa[u])pu(u);
}
void del(int& rt,int u) {
if(u==rt) {
if(!ch[u][])rt=ch[u][];
else if(!ch[u][])rt=ch[u][];
else rt=ch[u][rd[ch[u][]]>=rd[ch[u][]]];
}
for(; ch[u][]&&ch[u][]; rot(ch[u][rd[ch[u][]]>=rd[ch[u][]]]));
int f=ch[u][]?:;
if(fa[u])ch[fa[u]][rel(u)]=ch[u][f];
if(ch[u][f])fa[ch[u][f]]=fa[u];
for(u=fa[u]; u; u=fa[u])pu(u);
}
int kth(int u,int k) {
while(k!=siz[ch[u][]]+) {
if(k<siz[ch[u][]]+)u=ch[u][];
else k-=siz[ch[u][]]+,u=ch[u][];
}
return u;
}
int next(int u) {
if(ch[u][]) {
for(u=ch[u][]; ch[u][]; u=ch[u][]);
return u;
} else {
for(; fa[u]&&rel(u); u=fa[u]);
return fa[u];
}
}
int prev(int u) {
if(ch[u][]) {
for(u=ch[u][]; ch[u][]; u=ch[u][]);
return u;
} else {
for(; fa[u]&&!rel(u); u=fa[u]);
return fa[u];
}
}
int lb(int rt,int x) {
int v=;
for(int u=rt; u; u=ch[u][x>val[u]])if(val[u]>=x)v=u;
return v;
}
int ub(int rt,int x) {
int v=;
for(int u=rt; u; u=ch[u][x>=val[u]])if(val[u]>x)v=u;
return v;
}
void go() {
init();
const int mod=;
const int inf=0x3f3f3f3f;
int rt=,cnt=,m,ans=;
ins(rt,newnode(inf));
ins(rt,newnode(~inf));
scanf("%d",&m);
while(m--) {
int f,x;
scanf("%d%d",&f,&x);
if(f==) {
if(cnt<) {
int r=lb(rt,x),l=prev(r);
if(abs(val[l]-x)<=abs(val[r]-x)) {
ans=(ans+abs(val[l]-x))%mod;
del(rt,l);
} else {
ans=(ans+abs(val[r]-x))%mod;
del(rt,r);
}
} else ins(rt,newnode(x));
cnt++;
} else {
if(cnt>) {
int r=lb(rt,x),l=prev(r);
if(abs(val[l]-x)<=abs(val[r]-x)) {
ans=(ans+abs(val[l]-x))%mod;
del(rt,l);
} else {
ans=(ans+abs(val[r]-x))%mod;
del(rt,r);
}
} else ins(rt,newnode(x));
cnt--;
}
}
printf("%d\n",ans);
}
} treap; int main() {
treap.go();
return ;
}
splay:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct Splay {
static const int N=1e5+;
int ch[N][],siz[N],val[N],fa[N],tot;
int rel(int u) {return ch[fa[u]][]==u;}
void init() {tot=fa[]=ch[][]=ch[][]=siz[]=val[]=;}
int newnode(int x) {
int u=++tot;
fa[u]=ch[u][]=ch[u][]=;
siz[u]=,val[u]=x;
return u;
}
void pu(int u) {siz[u]=siz[ch[u][]]+siz[ch[u][]]+;}
void rot(int u) {
int v=fa[u],f=rel(u),ff=rel(v);
ch[v][f]=ch[u][f^],fa[ch[v][f]]=v;
ch[u][f^]=v,fa[u]=fa[v],fa[v]=u;
if(fa[u])ch[fa[u]][ff]=u;
pu(v),pu(u);
}
void splay(int& rt,int u) {
for(int v=fa[rt]; fa[u]!=v; rot(u))
if(fa[fa[u]]!=v&&rel(fa[u])==rel(u))rot(fa[u]);
rt=u;
}
void ins(int& rt,int u) {
if(!rt) {rt=u; return;}
int v;
for(v=rt; ch[v][val[u]>=val[v]]; v=ch[v][val[u]>=val[v]]);
ch[v][val[u]>=val[v]]=u,fa[u]=v;
splay(rt,u);
}
void del(int& rt,int u) {
splay(rt,u);
if(!ch[u][])rt=ch[u][];
else if(!ch[u][])rt=ch[u][];
else {
splay(ch[rt][],kth(ch[rt][],));
ch[ch[rt][]][]=ch[rt][];
rt=fa[ch[rt][]]=ch[rt][];
pu(rt);
}
fa[rt]=;
}
int kth(int u,int k) {
while(k!=siz[ch[u][]]+) {
if(k<siz[ch[u][]]+)u=ch[u][];
else k-=siz[ch[u][]]+,u=ch[u][];
}
return u;
}
int next(int u) {
if(ch[u][]) {
for(u=ch[u][]; ch[u][]; u=ch[u][]);
return u;
} else {
for(; fa[u]&&rel(u); u=fa[u]);
return fa[u];
}
}
int prev(int u) {
if(ch[u][]) {
for(u=ch[u][]; ch[u][]; u=ch[u][]);
return u;
} else {
for(; fa[u]&&!rel(u); u=fa[u]);
return fa[u];
}
}
int lb(int rt,int x) {
int v=;
for(int u=rt; u; u=ch[u][x>val[u]])if(val[u]>=x)v=u;
return v;
}
int ub(int rt,int x) {
int v=;
for(int u=rt; u; u=ch[u][x>=val[u]])if(val[u]>x)v=u;
return v;
}
void go() {
init();
const int mod=;
const int inf=0x3f3f3f3f;
int rt=,cnt=,m,ans=;
ins(rt,newnode(inf));
ins(rt,newnode(~inf));
scanf("%d",&m);
while(m--) {
int f,x;
scanf("%d%d",&f,&x);
if(f==) {
if(cnt<) {
int r=lb(rt,x),l=prev(r);
if(abs(val[l]-x)<=abs(val[r]-x)) {
ans=(ans+abs(val[l]-x))%mod;
del(rt,l);
} else {
ans=(ans+abs(val[r]-x))%mod;
del(rt,r);
}
} else ins(rt,newnode(x));
cnt++;
} else {
if(cnt>) {
int r=lb(rt,x),l=prev(r);
if(abs(val[l]-x)<=abs(val[r]-x)) {
ans=(ans+abs(val[l]-x))%mod;
del(rt,l);
} else {
ans=(ans+abs(val[r]-x))%mod;
del(rt,r);
}
} else ins(rt,newnode(x));
cnt--;
}
}
printf("%d\n",ans);
}
} splay; int main() {
splay.go();
return ;
}
HNOI2004 宠物收养所 (平衡二叉树)的更多相关文章
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7514 Solved: 2982[Submit][Sta ...
- bzoj 1208: [HNOI2004]宠物收养所 set
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7328 Solved: 2892[Submit][Sta ...
- 数据结构(set):COGS 62. [HNOI2004] 宠物收养所
62. [HNOI2004] 宠物收养所 ★★★ 输入文件:pet.in 输出文件:pet.out 简单对比时间限制:1 s 内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...
- bzoj1208 [HNOI2004]宠物收养所(STL,Treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5956 Solved: 2317[Submit][Sta ...
- BZOJ 1208: [HNOI2004]宠物收养所(BST)
本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...
- BZOJ_1208_[HNOI2004]宠物收养所_SPLAY
BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...
- bzoj 1208: [HNOI2004]宠物收养所 (Treap)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...
- 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:/ ...
随机推荐
- <script>放在head内和body内有什么区别
加载的顺序不一样,你可以把HTML看成从上往下加载的. 例如在网速慢的情况下把js代码放在body底部用户会先看到网页结构,等js加载完成后才出现特效 区别简述: 在HTML body部分中的Java ...
- ETL应用:使用Pro*C写入文件信息入库的方法
ETL处理过程中,经常需要进行文件校验,如文件级校验.记录级校验,需要保存文件的基本信息,文件名.文件大小.数据日期等,使用Pro*C的一种方法如下: #include <stdio.h> ...
- DNS 安装配置
DNS 安装配置 实验环境 一台主机:Linux Centos 6.5 32位 安装包: DNS服务:bind.i686 DNS测试工具:bind-utils DNS 服务安装 1.yum安装DNS服 ...
- Nginx 常见报错
Nginx 常见报错 启动报错:[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 原因:这个是nginx重启时经常遇到 ...
- OC_NSFileManager
案例1:通过文件扩展名进行搜索文件 NSFileManager *manager = [NSFileManager defaultManager]; /* 在Mac OS X系统有一个代表主目录的速 ...
- QT应用程序设置图标
一.纯Qt 1.下载图标:app.ico 2.新建记事本,输入:IDI_ICON1 ICON DISCARDABLE"app.ico":改变名字为jude.rc 3.将两个文件放在 ...
- 1.mysql导论
虽然之前用过mysql一年多,但大多只是会用,深入了解的不多.所以想利用平时时间 系统的总结总结. 一.什么是数据库:(数据库软件) 1).什么是数据库(软件):数据库(DB:DataBase ...
- 开机启动顺序rc.local与chkconfig的不同
/etc/rc.local文件有如下两行/etc/init.d/mysql start/etc/init.d/keepalived start /etc/rc.local是按脚本的顺序一个启动后启动下 ...
- HDFS数据完整性
数据完整性 Hadoop用户肯定都希望系统在存储和处理数据时不会丢失或损坏任何数据.尽管磁盘或网络上的每个I/O操作不太可能将错误引入自己正在读/写的数据中,但是如果系统中需要处理的数据量大到Hado ...
- 派派和京东的paipai域名之争
最近有一款叫“派派”的APP很火,微博上.电梯里.群里到处都是推广广告.不仅如此,还有大张伟.关晓彤.王祖蓝等十几个明星发帖为“派派”站台.有消息称,派派这段时间仅线上推广就花去了约1600万. 总融 ...