BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】
BZOJ1208 HNOI2004 宠物收养所
Description
最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。 1. 被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。 2. 收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。 一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。【任务描述】你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。
Input
第一行为一个正整数n,n<=80000,表示一年当中来到收养所的宠物和领养者的总数。接下来的n行,按到来时间的先后顺序描述了一年当中来到收养所的宠物和领养者的情况。每行有两个正整数a, b,其中a=0表示宠物,a=1表示领养者,b表示宠物的特点值或是领养者希望领养宠物的特点值。(同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个)
Output
仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和mod 1000000以后的结果。
Sample Input
5
0 2
0 4
1 3
1 2
1 5
Sample Output
3
HINT
(abs(3-2) + abs(2-4)=3,最后一个领养者没有宠物可以领养)
脑洞清奇的非旋Treap做法,看到题目中描述了两个时间,送宠物和领宠物,我们可以很容易的发现我们需要维护一个可以支持插入(送宠物),删除(领宠物),查询前驱+后继(匹配领哪一只)的数据结构,果断敲非旋Treap,思路是维护两棵Treap,一棵记录当前的宠物有哪些,另一棵记录当前没有满足的领宠物需求有哪些,容易发现,两棵Treap在同一时刻只有一个不为空,所以我们只需要在询问的时候判断一下需要访问的那一棵树是不是空,如果为空就在相应的树中插入,否则在另一棵树中查询答案后删除
写的时候因为把节点标号误认为是权值GG掉了。。。
大爱非旋Treap
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL read(){
LL ans=0,w=1;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')w=-1,c=getchar();
while(isdigit(c))ans=ans*10+c-'0',c=getchar();
return ans*w;
}
#define N 80010
typedef pair<LL,LL> pi;
const LL Mod=1e6;
struct Treap{
LL siz[N],val[N],key[N],son[N][2],tot,root;
void clear(){tot=root=0;}
LL new_treap_point(LL vl){
LL newt=++tot;
siz[newt]=1;
son[newt][0]=son[newt][1]=0;
val[newt]=vl;
key[newt]=rand();
return newt;
}
void update(LL o){
siz[o]=siz[son[o][0]]+siz[son[o][1]]+1;
}
LL merge(LL a,LL b){
if(!a)return b;
if(!b)return a;
if(key[a]<key[b]){
son[a][1]=merge(son[a][1],b);
update(a);return a;
}else{
son[b][0]=merge(a,son[b][0]);
update(b);return b;
}
}
pi split(LL o,LL k){
if(!o)return pi(0,0);
pi ans;
if(siz[son[o][0]]>=k){
pi tmp=split(son[o][0],k);
son[o][0]=tmp.second;
update(o);
ans.first=tmp.first;
ans.second=o;
}else{
pi tmp=split(son[o][1],k-siz[son[o][0]]-1);
son[o][1]=tmp.first;
update(o);
ans.first=o;
ans.second=tmp.second;
}
return ans;
}
LL getrank(LL o,LL vl){
if(!o)return 0;
if(val[o]==vl)return siz[son[o][0]]+1;
else if(val[o]>vl)return getrank(son[o][0],vl);
else return getrank(son[o][1],vl)+siz[son[o][0]]+1;
}
void insert(LL vl){
LL k=getrank(root,vl);
pi x=split(root,k);
LL o=new_treap_point(vl);
root=merge(merge(x.first,o),x.second);
}
void erase(LL vl){
LL k=getrank(root,vl);
pi x=split(root,k);
root=merge(split(x.first,k-1).first,x.second);
}
LL get_pre(int vl){
int k=getrank(root,vl);
pi x=split(root,k);
pi y=split(x.first,k-1);
LL ans=val[y.second];
root=merge(merge(y.first,y.second),x.second);
return ans;
}
LL get_next(int vl){
int k=getrank(root,vl);
pi x=split(root,k);
pi y=split(x.second,1);
LL ans=val[y.first];
root=merge(x.first,merge(y.first,y.second));
return ans;
}
LL query(LL vl){
LL ls=get_pre(vl),rs=get_next(vl);
if(!ls)return rs;
if(!rs)return ls;
if(rs-vl<vl-ls)return rs;
else return ls;
}
}A,B;
LL n,ans=0;
int main(){
A.clear();B.clear();
n=read();
for(LL i=1;i<=n;i++){
LL op=read(),x=read();
switch(op){
case 0:{
if(!B.siz[B.root])A.insert(x);
else{
LL t=B.query(x);B.erase(t);
ans=(ans+abs(t-x))%Mod;
}
break;
}
case 1:{
if(!A.siz[A.root])B.insert(x);
else{
LL t=A.query(x);A.erase(t);
ans=(ans+abs(t-x))%Mod;
}
break;
}
}
}
printf("%lld",ans);
return 0;
}
BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】的更多相关文章
- 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- bzoj1208 [HNOI2004]宠物收养所(STL,Treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5956 Solved: 2317[Submit][Sta ...
- BZOJ1208[HNOI2004]宠物收养场——treap
凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领 ...
- [bzoj1208][HNOI2004][宠物收养所] (平衡树)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- Bzoj1208 [HNOI2004]宠物收养所
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7457 Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...
- [bzoj1208][HNOI2004]宠物收养所——splay
题目大意 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发 ...
- bzoj1208: [HNOI2004]宠物收养所 (sbt)
切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解 ...
- BZOJ1208 [HNOI2004]宠物收养所 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8085803.html 题目传送门 - BZOJ1208 题意概括 有两种数,依次加入. 规则为下: 如果当前剩余 ...
- 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所
每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...
随机推荐
- 创建Jmeter中使用的jar包中的工具类方法
1. 在IDEA中新建一个maven工程. 2. 编写工具类方法,如加密算法.此处以加法为例. package DemoTest; public class DemoClass{ public int ...
- 读取文件并找出年龄最大的N个人-兰亭集市笔试题
C++ code: #include <iostream> #include <fstream> #include <map> #include <strin ...
- string与位运算
1.String String a="abc"; 会在常量池中开辟一个空间,保存"abc" String b=new String("abc&q ...
- jquery插件之jquery-ui
1.jQuery UI是在jQuery的基础上,利用jQuery的扩展性,设计的插件.提供了一些常用的界面元素,如:模态框.日期控件等. 2.下载地址:http://jqueryui.com/down ...
- 由angular命令行工具(angular-cli)生成的目录和文件
e2e目录:是端到端的测试目录,包含基本的测试桩.是用来做自动测试的. src:应用源代码目录.我们写的所有代码都应该在这里面. app:包括应用的组件和模块.我们自己写的绝大部分代码都是写在这个目录 ...
- photoshop CS5制作具有立体感的按钮
今天在学习用photoshop cs5制作html模板的过程中,遇到了立体感按钮的制作问题.当然按钮的立体感也可以用CSS来实现,这里主要是用PS来制作具有立体感的按钮. 我也是PS新手,下面的东西, ...
- Kafka消息文件存储
在对消息进行存储和缓存时,Kafka依赖于文件系统.(Page Cache) 线性读取和写入是所有使用模式中最具可预计性的一种方式,因而操作系统采用预读(read-ahead)和后写(write-be ...
- Bootstrap 与 IE 兼容模式 关系讲解
IE 兼容模式 Bootstrap 不支持 IE 古老的兼容模式.为了让 IE 浏览器运行最新的渲染模式下,建议将此 <meta> 标签加入到你的页面中:Copy <meta htt ...
- 修改linux系统用户最大线程数限制
linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,或者是shell request fa ...
- 【BZOJ3597】方伯伯运椰子(分数规划,网络流)
[BZOJ3597]方伯伯运椰子(分数规划,网络流) 题解 给定了一个满流的费用流模型 如果要修改一条边,那么就必须满足流量平衡 也就是会修改一条某两点之间的路径上的所有边 同时还有另外一条路径会进行 ...