解析

这题似乎是裸的平衡树\(+\)模拟...于是用\(treap\)写了个板子.

看上去,我们似乎要维护两颗树(宠物和顾客),

然而,注意到,同一时间宠物点只有一类人(或物qwq),

所以,只要判断当前宠物店和询问是否是一样,

根据题意模拟就行了.

另外,没有重复感觉比较舒服

上AC代码吧:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#define INF 0x7fffffff
#define Mod 1000000
using namespace std; inline int read(){
int sum=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){sum=sum*10+c-'0';c=getchar();}
return sum*f;
} struct tree{int l,r,val,dat;}t[1000001];
int n,root,tot=0,ans=0;
int ok,sum=0; inline int New(int val){
t[++tot].val=val;t[tot].dat=rand();
return tot;
} inline void build(){
New(-INF);New(INF);
root=1;t[1].r=2;
} inline void zig(int &p){
int q=t[p].l;
t[p].l=t[q].r;t[q].r=p;p=q;
} inline void zag(int &p){
int q=t[p].r;
t[p].r=t[q].l;t[q].l=p;p=q;
} void insert(int &p,int val){
if(!p){p=New(val);return ;}
insert(val<t[p].val? t[p].l:t[p].r,val);
if(t[t[p].l].dat>t[p].dat) zig(p);
if(t[t[p].r].dat>t[p].dat) zag(p);
} void remove(int &p,int val){
if(!p) return ;
if(t[p].val==val){
if(!t[p].l&&!t[p].r){p=0;return ;}
if(!t[p].r||t[t[p].l].dat>t[t[p].r].dat){
zig(p);remove(t[p].r,val);
}
else{
zag(p);remove(t[p].l,val);
}
}
remove(val<t[p].val? t[p].l:t[p].r,val);
} inline int getpre(int val){
int ans=1,p=root;
while(p){
if(t[p].val==val) return val;
if(t[p].val<val&&t[p].val>t[ans].val) ans=p;
p=val<t[p].val? t[p].l:t[p].r;
}
return t[ans].val;
} inline int getnext(int val){
int ans=2,p=root;
while(p){
if(t[p].val==val) return val;
if(t[p].val>val&&t[p].val<t[ans].val) ans=p;
p=val<t[p].val? t[p].l:t[p].r;
}
return t[ans].val;
} inline void find(int val){
int l=getpre(val),r=getnext(val);
if(l!=-INF&&val-l<=r-val){ans=(ans+val-l)%Mod;remove(root,l);sum--;}
else{ans=(ans+r-val)%Mod;remove(root,r);sum--;}
} int main(){
n=read();build();
for(int i=1;i<=n;i++){
int x=read(),y=read();
if(!sum){insert(root,y);sum++;ok=x;}//店里什么都没有
else if(x==ok){insert(root,y);sum++;}//询问和店里的一样
else find(y);//不一样,可以带走
}
printf("%d\n",ans);
return 0;
}

题解 [HNOI2004]宠物收养场的更多相关文章

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

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

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

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

  3. P2286 [HNOI2004]宠物收养场

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

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

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

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

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

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

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

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

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

  8. LG_2286_[HNOI2004]宠物收养场

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

  9. 1208. [HNOI2004]宠物收养场【平衡树-splay】

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

随机推荐

  1. SpringBoot起飞系列-拦截器和统一错误处理(七)

    一.前言 在前边部分我们已经学会了基本的web开发流程,在web开发中,我们通常会对请求做统一处理,比如未登录的用户要拦截掉相关请求,报错页面统一显示等等,这些都需要配置,可以大大简化我们的代码,实现 ...

  2. PAT A1077 Kuchiguse (20)

    晴神书中AC代码 #include <cstdio> #include <cstring> #include <iostream> using namespace ...

  3. [LGP4707] 重返现世

    世界是物质的,物质是运动的,运动是有规律的,规律是可以被认识的. 关于期望意义下min-max容斥,我们认为每个事件的时间来认识事件,max/min S表示集合S中所有时间最后/最前出现的事件,E(m ...

  4. LKM rootkit:Reptile学习

    简介 Reptile是github上一个很火的linux lkm rootkit,最近学习了一些linux rootkit的内容,在这里记录一下. 主要是分析reptile的实现 Reptile的使用 ...

  5. Spring 注解介绍

    @Component与@Bean的区别 @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean. @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注 ...

  6. WebMvcConfigurationSupport跨域和fastjson全局替换

    @Configuration public class WarnWebMvcConfigurationSupport extends WebMvcConfigurationSupport { /** ...

  7. X86逆向4:VMP壳内寻找注册码

    本节课将讲解一下重启验证,重启验证在软件中也是非常的常见的,重启验证的原理很简单,用户在注册界面输入注册码以后程序会自动将输入的注册信息保存到配置文件中,这里可能保存到注册表,也可能使用INI文件来保 ...

  8. Java Serializable Objects(序列化)

    https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html 序列化一个对象,意味着把这个对象的状态转化为字节流,而且个字节流 ...

  9. 【原创】大叔经验分享(60)hive和spark读取kudu表

    从impala中创建kudu表之后,如果想从hive或spark sql直接读取,会报错: Caused by: java.lang.ClassNotFoundException: com.cloud ...

  10. SVN客户端(TortoiseSVN)保存密码自动登录后,如何切换使用其它帐户登录方法

    清除SVN客户端(TortoiseSVN)保存的认证信息(用户名和密码) 1.选择TortoiseSVN---->Settings. 2.点"Clear” ,清空Authenticat ...