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:/ ...
随机推荐
- loadrunner脚本篇——Run-time Settings之ContentCheck
运用场景(很少用到): ContentCheck的设置可用来让VuGen检测存在错误的站点页面.如果被测的Web应用没有使用自定义的错误页面,那么这里不用添加规则,因为LR在回放时候,可以默认的捕捉到 ...
- Vuex的入门教程
前言 在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式,详细点击这篇文章查看. 但是如果是大型项目,很多时候都需要在子组件之间传递 ...
- sed实例
删除:d命令 $ sed '2d' example-----删除example文件的第二行. $ sed '2,$d' example-----删除example文件的第二行到末尾所有行. $ sed ...
- 模型融合之blending和stacking
1. blending 需要得到各个模型结果集的权重,然后再线性组合. """Kaggle competition: Predicting a Biological Re ...
- 树 List Leaves 【用数组模拟了树状结构建树+搜索叶子节点+按照特殊规律输出每个叶子节点】
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...
- 3.django连接mysql数据库及安装mysqldb驱动报错解决办法
1.在setting.py设置连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djang ...
- java中如何将非整数保留到小数点后指定的位数
- sqlserver 实时同步(发布订阅)
配置发布订阅手册 不同版本须知:https://www.sqlmanager.net/en/articles/1548 向后兼容性:参考https://docs.microsoft.com/zh-cn ...
- java 项目中每个jar包的作用总结
别人的总结 1.Struts2 1)commons-fileupload :2)common-io:文件上传 3)commons-lang:它扩展了标准 java.langAPI ArrayUtils ...
- MapReduce-从HBase读取数据处理后再写入HBase
MapReduce-从HBase读取处理后再写入HBase 代码如下 package com.hbase.mapreduce; import java.io.IOException; import o ...