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:/ ...
随机推荐
- linux常用技巧(资料)
Linux中查看程序安装位置 如果是rpm的安装,用rpm -ql如果是一般安装 用 whereis 或者 find find /usr -name catalina.out======== 如何查看 ...
- 建议42:使用pandas处理大型CSV文件
# -*- coding:utf-8 -*- ''' CSV 常用API 1)reader(csvfile[, dialect='excel'][, fmtparam]),主要用于CSV 文件的读取, ...
- pppoe白皮书
转:https://blog.csdn.net/achejq/article/details/19478811 PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘 要:PPP ...
- webstrom突然不显示文件夹
不知道什么原因,webstrom突然不显示文件夹了,弄得几乎都不能用了... 百度搜了一下解决方案: 问题原因:webstorm自动生成的配置文件 .idea/modules.xml损坏(就是我一开始 ...
- FullPage.js全屏滚动插件
一.介绍 fullPage.js是一个基于jQuery的插件,他能够很方便.很轻松的制作出全屏网站,主要功能有: 1.支持鼠标滚动 2.多个回调函数 3.支持手机.平板触摸事件 4.支持CSS3动画 ...
- 20145240《Java程序设计》第七周学习总结
20145240<Java程序设计>第七周学习总结 教材学习内容总结 12.1认识Lambda语法 12.1.1Lambda语法概览 在java中引入了Lambda的同时,与现有API维持 ...
- 吴恩达深度学习笔记(七) —— Batch Normalization
主要内容: 一.Batch Norm简介 二.归一化网络的激活函数 三.Batch Norm拟合进神经网络 四.测试时的Batch Norm 一.Batch Norm简介 1.在机器学习中,我们一般会 ...
- JAVA基础补漏--字符串
字符串常量池 String a="abc"; String b="abc"; char[] str = {"a","b" ...
- centos中如何寻找Nginx,Apache,PHP,mysql的配置路径
很多小伙伴都可能会碰到安装好环境之后忘记了或者不知道怎么查看配置环境的文件路径了, 下面我就来介绍centos中nginx.apache.php.mysql配置文件路径查看方法吧. 1.判断apach ...
- SpringBoot2.0之整合Kafka
maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...