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:/ ...
随机推荐
- jQuery EasyUI - 数据表格(DataGrid)
由于工作需要,项目使用前端 jQuery EasyUI - DataGrid 来控制数据表格. 1.加载相关js和css,因为easyui依赖jquery,所有加载easyui前要先加载jquery, ...
- Funq之Lambda表达式2
Last month I started a series of posts covering some of the new VB and C# language features that are ...
- zookeeper部署搭建
zookeeper教程 1.先在linux系统中安装jdk并配置环境变量,可以参考下面的链接1 2.下载安装zookeeper软件 教程参考: 链接1:http://www.linuxidc.com/ ...
- 获取电脑连接WiFi的信息
在cmd中执行如下命令,即可查看到所有连接过的WiFi信息 for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show ...
- Js 类型方面的神坑
你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况... ...
- 线程同步synchronized和ReentrantLock
一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...
- mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)
mongodb 中的aggretion 中,如果管道中存在一个与之相匹配的shard key ,那么这个管道只运行在与之相匹配的shard 中,在以前(3.2),pipeline 被分流,最后又由pr ...
- Web项目java.lang.OutOfMemoryError: PermGen space异常解决
接手一个新的Web项目,编译运行(Tomcat版本为7),运行的时候报出了java.lang.OutOfMemoryError: PermGen space的异常,搜了一下这样解释: PermGe ...
- IDEA: 遇到问题Error during artifact deployment. See server log for details.详解
IDEA 的配置确实有些烦人,完整的配置我之前发过,现在有个著名的报错: Error during artifact deployment. See server log for details. 这 ...
- mysql一次运行多个SQL文件
在文件 batch.sql 中写下多个SQL文件 source file1.SQLsource file2.SQLsource file3.SQL 然后运行 source batch.sql