[HNOI2004]宠物收养场
fhq treap
开俩哨兵节点,然后插入、删除、前驱、后继,统计即可
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
#include"ctime"
using namespace std;
const int MAXN=8e4+5;
const int MOD=1e6;
int n,cnt,root,co;
bool kd;
long long ans;
int siz[MAXN],sn[MAXN][2],rev[MAXN];
long long val[MAXN];
int cret(long long v)
{
siz[++cnt]=1;
val[cnt]=v;
rev[cnt]=rand();
return cnt;
}
int un(int x,int y)
{
if(!x||!y) return x|y;
if(rev[x]<=rev[y]){
sn[x][1]=un(sn[x][1],y);
siz[x]=siz[sn[x][0]]+siz[sn[x][1]]+1;
return x;
}sn[y][0]=un(x,sn[y][0]);
siz[y]=siz[sn[y][0]]+siz[sn[y][1]]+1;
return y;
}
void dro(int k,int v,int &x,int &y)
{
if(!k){x=y=0;return;}
if(val[k]<=v) x=k,dro(sn[k][1],v,sn[k][1],y);
else y=k,dro(sn[k][0],v,x,sn[k][0]);
siz[k]=siz[sn[k][0]]+siz[sn[k][1]]+1;
return;
}
int rnk(int k,int v)
{
if(sn[k][0]==k) return n+1;
if(v<=siz[sn[k][0]]) return rnk(sn[k][0],v);
if(v==siz[sn[k][0]]+1) return k;
return rnk(sn[k][1],v-siz[sn[k][0]]-1);
}
void ins(int v)
{
int x,y;
dro(root,val[v],x,y);
root=un(un(x,v),y);
return;
}
void del(int v)
{
int x,y,z,c;
dro(root,v,x,z),dro(x,v-1,x,y);c=y;
y=un(sn[y][0],sn[y][1]);sn[c][0]=sn[c][1]=val[c]=siz[c]=0;
root=un(un(x,y),z);
return;
}
void debug()
{
for(int i=1;i<=siz[root];++i) printf("%d ",val[rnk(root,i)]);
puts("-");
}
int main()
{
scanf("%d",&n);
int ct1=cret((long long)-1e10),ct2=cret((long long)1e10);
ins(ct1);ins(ct2);
while(n--){
int c,v;scanf("%d%d",&c,&v);
if(!co||kd==c){
kd=c;++co;
int ct=cret(v);
ins(ct);
}else{
int x,y;--co;
dro(root,v,x,y);
long long ct1=val[rnk(x,siz[x])],ct2=val[rnk(y,1)];
root=un(x,y);
if(abs(ct1-v)<=abs(ct2-v)) del(ct1),ans=(ans+abs(ct1-v))%MOD;
else del(ct2),ans=(ans+abs(ct2-v))%MOD;
}
}printf("%lld\n",ans);
return 0;
}
[HNOI2004]宠物收养场的更多相关文章
- [HNOI2004]宠物收养场 Treap前驱后继
凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...
- P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- 洛谷P2286 [HNOI2004]宠物收养场【Treap】题解+AC代码
题目传送门啦~啦~啦~ 题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的 ...
- 洛谷P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- BZOJ1208[HNOI2004]宠物收养场——treap
凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...
- 洛谷 P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- [HNOI2004]宠物收养场 BZOJ1208 splay tree
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- LG_2286_[HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
- 1208. [HNOI2004]宠物收养场【平衡树-splay】
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- [HNOI2004]宠物收养场(Treap)
洛谷传送门 这题真是恶心,一开始没理解题意. 原来如果有狗,狗就会存在收养场中,直到有人来领养: 如果有人,人也会存在收养场中,直到有狗来被领养. 就是建一个treap,狗来把狗插进去,人来后把狗领养 ...
随机推荐
- Java并发工具类之并发数控制神器Semaphore
Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所( ...
- [JavaScript] 根据字符串宽度截取字符串
/** * 根据字符串宽度截取字符串 * @param desc 原始字符串 * @param width 该显示的宽度 * @param fontsize 字体大小 12px * @returns ...
- SELECT 三级联动 [转]
<!DOCTYPE html> <html> <head> <meta charset=gbk /> <title>selectList&l ...
- Swinject 源码框架(三):Object Scopes
Object Scopes 指定了生成的实例在系统中是如何被共享的. 如何指定 scope container.register(Animal.self) { _ in Cat() } .inObje ...
- 导数、多元函数、梯度、链式法则及 BP 神经网络
一元函数的导数 对于函数\(y=f(x)\),导数可记做\(f'(x_0)\).\(y'|x=x_0\)或\(\frac{dy}{dx}|x=x_0 \).定义如下: \[f'(x_0) = \lim ...
- JAVA线程本地变量ThreadLocal和私有变量的区别
ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 所以,在Java中编写线程局部变量的代码相对来说要笨 ...
- ajax获取json数据及实现跨域请求
最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...
- Web端测试和移动端测试
之前参加的项目有涉及Web端测试和移动端测试,简单的记录下他们之间的区别: 1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来 ...
- Requests库入门实例
爬虫入门5个实例 实例1:京东商品页面的爬取 import requests def getHTMLText(url): try: r = requests.get(url,timeout = 30) ...
- selenium+java iframe定位
关于 driver.switchTo().frame(参数).这中间的参数表达有以下几种方式. driver.switchTo().frame(0):用<iframe>标签的位置数量来 ...