题目链接

平衡树基础题,用于测试各种平衡树的性能(雾)

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 宠物收养所 (平衡二叉树)的更多相关文章

  1. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Sta ...

  2. bzoj 1208: [HNOI2004]宠物收养所 set

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Sta ...

  3. 数据结构(set):COGS 62. [HNOI2004] 宠物收养所

    62. [HNOI2004] 宠物收养所 ★★★   输入文件:pet.in   输出文件:pet.out   简单对比时间限制:1 s   内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...

  4. bzoj1208 [HNOI2004]宠物收养所(STL,Treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5956  Solved: 2317[Submit][Sta ...

  5. BZOJ 1208: [HNOI2004]宠物收养所(BST)

    本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...

  6. BZOJ_1208_[HNOI2004]宠物收养所_SPLAY

    BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...

  7. bzoj 1208: [HNOI2004]宠物收养所 (Treap)

    链接:  https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...

  8. 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...

  9. BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:/ ...

随机推荐

  1. 2015.7.16(小高开忍住没有减仓,大盘涨3.5%,百股涨停——买进中重、中航,指导WXL错误)

    1.大智慧轻微高开,按照昨天总结的震荡行情指导操作(pic1) a.震荡行情,开盘5分钟的走势不能指导操作, b.操作一定要等到2峰2谷出现后再做!开盘价不能作为峰.谷! c.只有当通道出现2.0%以 ...

  2. smarty变量调节器与函数

    smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...

  3. PAT 天梯赛 L1-025. 正整数A+B 【字符串处理】

    题目链接 https://www.patest.cn/contests/gplt/L1-025 思路 注意 输入字符串B的时候 要用getline 因为 可能存在空格 然后就把字符串 转化成 数字 并 ...

  4. $Android AlertDialog的各种用法总结

    Refer:http://www.2cto.com/kf/201205/131876.html (一)最简单的用法(详见注释) 1 // 1.创建简单的AlertDialog // AlertDial ...

  5. Linux常用指令——周琛

    ps ax | grep java 查看进程命令里带“java”字样的进程信息,第一列是进程号 kill -9 1234 强制杀死1234号进程 cd /xxx/xxx 进入/xxx/xxx目录 cd ...

  6. pd.read_csv的header用法

    默认Header = 0: In [3]: import pandas as pd In [4]: t_user = pd.read_csv(r'C:\Users\Song\Desktop\jdd_d ...

  7. vRO 添加已有磁盘到VM

    在vRO实现将已有虚拟机磁盘添加到另外的虚拟机上,以为vRA发布Oracle/SQL集群做准备: // 脚本需要两个输入 vm_obj和diskPathSystem.log("Attempt ...

  8. windows10添加电源计划修改的快捷方案

    转自:http://news.mydrivers.com/1/431/431346.htm 由于目前的Windows 10预览版在UI方面还未优化到位,所以某些设置选项要想找出来是很难的,这时候如果能 ...

  9. MapReduce-输入分片与记录

    一个输入分片(split)就是一个由单个map操作来处理的输入块.每一个map操作只处理一个输入分片.每个分片被划分为若干个记录,每条记录就是一个键值对,map一个接一个地处理记录.输入分片和记录都是 ...

  10. uva 11752 The Super Powers 素数+大数判断大小

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...