懒得复制,戳我戳我

Solution:

  • \(Splay\)板子,注意交换的地方,然后就是注意不要越界node[x],应该是\(node[now]\),其次就是数组可以开大点

Code:

//It is coded by Ning_Mew on 4.10
#include<bits/stdc++.h>
#define ls(x) node[x].ch[0]
#define rs(x) node[x].ch[1]
#define fa(x) node[x].fa
#define root node[0].ch[1]
using namespace std; const int maxn=200000+10,INF=1e9+7,MOD=1e6; int n,ans=0,tot=0;
struct Node {
int fa,ch[2],cnt,val,size;
} node[maxn]; void update(int x) {node[x].size=node[ls(x)].size+node[rs(x)].size+node[x].cnt;}
void connect(int x,int fa,int how) {node[x].fa=fa;node[fa].ch[how]=x;}
int ident(int x) {return x==node[fa(x)].ch[0]?0:1;}
void rorate(int x) {
int Y=fa(x),R=fa(Y); int Yson=ident(x),Rson=ident(Y);
connect(node[x].ch[Yson^1],Y,Yson);
connect(Y,x,Yson^1);
connect(x,R,Rson);
update(Y);update(x);
}
void Splay(int x,int goal) {
int to=fa(goal);
while(fa(x)!=to) {
if(fa(fa(x))==to)rorate(x);
else if(ident(x)==ident(fa(x)))rorate(fa(x)),rorate(x);
else rorate(x),rorate(x);
}
}
int newnode(int x,int fa) {node[++tot].val=x;node[tot].cnt=node[tot].size=1;node[tot].fa=fa;return tot;}
void ins(int x) {
int now=root;
if(!root) {newnode(x,0);root=tot;return;
} else {
while(1) {
node[now].size++;
if(node[now].val==x) {node[now].cnt++;Splay(now,root);return;}
int nxt=x<node[now].val?0:1;
if(!node[now].ch[nxt]) {
int p=newnode(x,now);
node[now].ch[nxt]=p; Splay(p,root);
return;
}
now=node[now].ch[nxt];
}
}
}
int find(int x) {
int now=root;
while(1) {
if(!now)return 0;
if(node[now].val==x) {Splay(now,root);return now;}
int nxt=x<node[now].val?0:1;
now=node[now].ch[nxt];
}
}
void del(int x) {
int pos=find(x);
if(!pos)return;
if(node[pos].cnt>1) {node[pos].cnt--;node[pos].size--;return;}
if(!node[pos].ch[0]&&!node[pos].ch[1]) {root=0;return;}
if(!node[pos].ch[0]) {root=node[pos].ch[1];node[root].fa=0;return;
} else {
int left=ls(pos);///
while(rs(left))left=rs(left);
Splay(left,node[pos].ch[0]);
connect(node[pos].ch[1],left,1);
connect(left,0,1);
update(left);return;
}
}
int lower(int x) {
int now=root,ans=-INF;
while(now) {
if(node[now].val<=x)ans=max(ans,node[now].val);
int nxt=x<=node[now].val?0:1;
now=node[now].ch[nxt];
}
return ans;
}
int upper(int x) {
int now=root,ans=INF;
while(now) {
if(node[now].val>=x)ans=min(ans,node[now].val);
int nxt=x<node[now].val?0:1;
now=node[now].ch[nxt];
}
return ans;
}
int num[5];
int main() {
scanf("%d",&n);
int x,opt,stat=0;
for(int i=1; i<=n; i++) {
scanf("%d%d",&opt,&x);
if(num[stat]==0) {
ins(x);
num[opt]++;
stat=opt;/*cout<<"ins finished"<<endl;*/
} else {
if(opt==stat)ins(x),num[opt]++/*,cout<<"ins finished"<<endl*/;
else {
num[stat]--;
int up=upper(x),low=lower(x),box=INF;
if(up!=INF)box=min(box,abs(x-up));
if(low!=-INF)box=min(box,abs(x-low));
//cout<<up<<' '<<low<<' '<<box<<endl;
ans=(ans+box)%MOD;
if(box==abs(x-low))del(low);
else del(up);
//cout<<"del finished"<<endl;
}
}
//cout<<"--"<<stat<<endl;
}
printf("%d\n",ans);
return 0;
}

【题解】 [HNOI2004]宠物收养场(Splay)的更多相关文章

  1. 题解 [HNOI2004]宠物收养场

    解析 这题似乎是裸的平衡树\(+\)模拟...于是用\(treap\)写了个板子. 看上去,我们似乎要维护两颗树(宠物和顾客), 然而,注意到,同一时间宠物点只有一类人(或物qwq), 所以,只要判断 ...

  2. [HNOI2004]宠物收养场 BZOJ1208 splay tree

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  3. 洛谷P2286 [HNOI2004]宠物收养场【Treap】题解+AC代码

    题目传送门啦~啦~啦~ 题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的 ...

  4. [HNOI2004]宠物收养场 Treap前驱后继

    凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...

  5. 洛谷P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  6. 洛谷 P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  7. Bzoj 1208: [HNOI2004]宠物收养所(splay)

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

  8. LG_2286_[HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  9. P2286 [HNOI2004]宠物收养场

    题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

  10. BZOJ1208[HNOI2004]宠物收养场——treap

    凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...

随机推荐

  1. Shell调试篇 转

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...

  2. 安装Docker的三种方式

    本人在安装docker时之前一直采用的是系统自带的docker软件包安装,导致下载的docker不是最新版本,因此会有很多docker命令无法使用,例如network等等,现将安装docker的方式总 ...

  3. kettle学习笔记(三)——kettle资源库、运行方式与日志

    一.kettle资源库 资源库是用来保存转换任务的,用户通过图形界面创建的的转换任务可以保存在资源库中. 资源库可以使多用户共享转换任务,转换任务在资源库中是以文件夹形式分组管理的,用户可以自定义文件 ...

  4. 20155204《网络对抗》Exp9 Web安全基础实践

    20155204<网络对抗>Exp9 Web安全基础实践 一.基础问题回答 SQL注入攻击原理,如何防御? 原理: SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以 ...

  5. MiZ702学习笔记8——让MiZ702变身PC的方法

    首先你需要一个安装好的linux系统,这里我用的是Ubuntu的虚拟机.VMWare的话,选择较高版本的成功率会高些(当然根据自己电脑的配置进行选择). 打开Ubuntu的虚拟机,找到一个叫做Disk ...

  6. vs如何将工程配置,保存到属性表

    上次讲到新建一个opencv工程的配置过程,整个流程下来还是非常麻烦的.每次新建一个工程都要走这个流程的话就要疯了! 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表 ...

  7. python 回溯法 子集树模板 系列 —— 2、迷宫问题

    问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将 ...

  8. 腾讯云CVM服务器怎么建网站

    腾讯云云服务器CVM站在用户的角度看就相当于一台计算机,虽然实际上它是一个虚拟服务器,是一个大的云端服务器集群虚拟出来的一个虚拟服务器,在使用上直接当做一个实际的服务器即可.那么,对于一个新手菜鸟来说 ...

  9. Eclipse中Hadoop插件配置

    Eclipse中Hadoop插件DFS配置 http://www.cnblogs.com/xia520pi/archive/2012/05/20/2510723.html

  10. Java设计模式-建造者(Builder)模式

    目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...