题目描述

凡凡开了一间宠物收养场。收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。

每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养场的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养场总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。

被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。

收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。

一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。

你得到了一年当中,领养者和被收养宠物到来收养所的情况,请你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。

输入输出格式

输入格式:

第一行为一个正整数n,n<=80000,表示一年当中来到收养场的宠物和领养者的总数。接下来的n行,按到来时间的先后顺序描述了一年当中来到收养场的宠物和领养者的情况。每行有两个正整数a, b,其中a=0表示宠物,a=1表示领养者,b表示宠物的特点值或是领养者希望领养宠物的特点值。(同一时间呆在收养所中的,要么全是宠物,要么全是领养者,这些宠物和领养者的个数不会超过10000个)

输出格式:

仅有一个正整数,表示一年当中所有收养了宠物的领养者的不满意程度的总和mod 1000000以后的结果。

输入输出样例

输入样例#1: 复制

5
0 2
0 4
1 3
1 2
1 5
输出样例#1: 复制

3
注:abs(3-2) + abs(2-4)=3,
最后一个领养者没有宠物可以领养。

哎呀一不小心拿了个rank1还比第二快9倍呢:joy:

这道题目比较简单

请选择一种数据结构,

支持插入、删除、求前驱后继

splay裸题

有一个小技巧:

在求前驱后继的时候增加两个哨兵节点

这样就不会加爆了

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int MAXN=1e6+;
const int mod=;
const int INF=*0x7ffffff;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,MAXN,stdin))?EOF:*p1++;
}
inline int read()
{
char c=nc();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=nc();}
while(c>=''&&c<=''){x=x*+c-'',c=nc();}
return x*f;
}
int PetNum;
#define root tree[0].ch[1]
struct node
{
int v,fa,ch[],rec;
}tree[MAXN]; int tot,point;
bool ident(int x)
{
return tree[tree[x].fa].ch[]==x?:;
}
void connect(int x,int fa,int how)
{
tree[x].fa=fa;
tree[fa].ch[how]=x;
}
void rotate(int x)
{
int Y=tree[x].fa;
int R=tree[Y].fa;
int Yson=ident(x);
int Rson=ident(Y);
int B=tree[x].ch[Yson^];
connect(B,Y,Yson);
connect(Y,x,Yson^);
connect(x,R,Rson);
}
void splay(int x,int to)
{
to=tree[to].fa;
while(tree[x].fa!=to)
{
if(tree[tree[x].fa].fa==to) rotate(x);
else if(ident(x)==ident(tree[x].fa)) rotate(tree[x].fa),rotate(x);
else rotate(x),rotate(x);
}
}
void newpoint(int x,int fa)
{
tree[++tot].v=x;
tree[tot].fa=fa;
tree[tot].rec=;
}
void insert(int x)
{
point++;
if(tot==){newpoint(x,);root=tot;return ;}
int now=root;
while()
{
if(tree[now].v==x)
{
tree[now].rec++;
splay(now,root);
return ;
}
int nxt=x<tree[now].v?:;
if(!tree[now].ch[nxt])
{
newpoint(x,now);
tree[now].ch[nxt]=tot;
splay(tot,root);
return ;
}
now=tree[now].ch[nxt];
}
}
int lower(int x)
{
int ans=-INF;
int now=root;
while(now)
{
if(tree[now].v<x) ans=max(ans,tree[now].v);
int nxt=x<tree[now].v?:;
if(tree[now].ch[nxt]==) return ans;
now=tree[now].ch[nxt];
}
return ans;
}
int upper(int x)
{
int ans=INF;
int now=root;
while(now)
{
if(tree[now].v>x) ans=min(ans,tree[now].v);
int nxt=x<tree[now].v?:;
if(tree[now].ch[nxt]==) return ans;
now=tree[now].ch[nxt];
}
}
int find(int x)
{
int now=root;
while()
{
if(tree[now].v==x) {splay(now,root);return now;}
int nxt=x<tree[now].v?:;
if(!tree[now].ch[nxt]) return ;
now=tree[now].ch[nxt];
}
}
void des(int x)
{
tree[x].ch[]=tree[x].ch[]=tree[x].fa=tree[x].rec=tree[x].v=;
if(x==tot) tot--;
}
void dele(int x)
{
int deal=find(x);
if(!deal) return ;
point--;
if(tree[deal].rec>){tree[deal].rec--;return ;}
if(!tree[deal].ch[]) root=tree[deal].ch[],tree[root].fa=;
else
{
int mxson=tree[deal].ch[];
while(tree[mxson].ch[]) mxson=tree[mxson].ch[];
splay(mxson,tree[deal].ch[]);
connect(tree[deal].ch[],mxson,);
connect(mxson,,);
}
des(deal);
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
int n=read(),ans=;
while(n--)
{
int opt=read(),x=read();
if(PetNum==)
{
insert(x);
if(opt==) PetNum++;
else PetNum--;
}
else if(PetNum>)
{
if(opt==) insert(x),PetNum++;
else
{
int pre=lower(x);
int lat=upper(x);
if(abs(pre-x)<=abs(x-lat)) dele(pre),ans=(ans+abs(pre-x))%mod;
else dele(lat),ans=(ans+abs(lat-x))%mod;
PetNum--;
}
}
else
{
if(opt==) insert(x),PetNum--;
else
{
int pre=lower(x);
int lat=upper(x);
if((abs(pre-x))<abs(x-lat)) dele(pre),ans=(ans+abs(pre-x))%mod;
//这里写小于等于和小于一样
else dele(lat),ans=(ans+abs(lat-x))%mod;
PetNum++;
}
}
}
printf("%d",ans);
}

洛谷P2286 [HNOI2004]宠物收养场的更多相关文章

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

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

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

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

  3. 洛谷P2286 [HNOI2004]宠物收养所 [STL,平衡树]

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

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

    原题地址:https://www.luogu.org/problemnew/show/P3384 题目简述 给定一些序列(没有重复数字),每个序列支持: 给定一些数k(对于每个序列不重复),每次在序列 ...

  5. P2286 [HNOI2004]宠物收养场

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

  6. 洛谷$P$2286 宠物收养场 $[HNOI2004]$ $splay$

    正解:$splay$ 解题报告: 传送门! $splay$板子,,,? 先考虑这题要实现些什么东西嘛$QwQ$ 其实只要实现一个东西?就查询数列中与给定数字相差最小的数,显然用$splay$查询前驱后 ...

  7. Luogu P2286 [HNOI2004]宠物收养场

    一道比较简单的直接Treap运用题目,思维难度和代码难度都不是很高. 题意有点长,我们仔细剖析一下题意发现以下几个关键: 任何时候收养站里只可能有人和宠物中的其中一种,或者都没有 如果只有宠物并有人来 ...

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

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

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

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

随机推荐

  1. 第57节:Java中流的操作以及编码解码

    我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为 ...

  2. canvas转图片中的文字自动换行

    概述 最近项目用到了canvas转图片,但是由于canvas对文字排版的支持非常弱,一般我们在canvas上画不同排版的文字(比如竖排文字)都是利用js计算横纵坐标,然后一个字一个字地画出来,今天无意 ...

  3. poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)

    题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...

  4. maven发布jar包到nexus

    在编码过程中,有些通用的代码模块,有时候我们不想通过复制拷贝来粗暴地复用,因为这样不仅体现不了变化,也不利于统一管理.这里我们使用maven deploy的方式,将通用的模块打成jar包,发布到nex ...

  5. 2014--My Plan

    写于2014/1/10 从2014年开始我每年规划自己的life,每年10个plans. 回忆2013: 2013年,改变了很多.准确的说,那10个月,像个漫长的旅程,像个人生的转折点,应该可以这么说 ...

  6. 从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. Node.js 获取微信JS-SDK CONFIG

    背景 前端在调用微信提供的分享.拍照.扫一扫等功能时需要到后台获取配置,主要是签名(signature).Node 开发可以用朴灵大佬的SDK--co-wechat-api. 配置 到微信公众平台进入 ...

  8. TensorflowSharp安装和使用入门

    Tensorflow是一个人工智能框架.TensorflowSharp是对Tensorflow C语言版接口的封装,便于C#开发人员在项目中使用Tensorflow. 一.使用方法 Tensorflo ...

  9. Windows编程之模块遍历(C++实现)

    Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...

  10. 使用Hexo搭建个人博客的终极资料

    一.前言 Hexo 是一个基于 NodeJs 博客框架,可以快速的帮我们搭建一个博客系统,Hexo使用的是Markdown(下文简称MD)解析文章的,在几秒内即可利用靓丽的主体生成静态网页. 推荐使用 ...