1285 宠物收养所

http://codevs.cn/problem/1285/

 时间限制: 1 s
 空间限制: 128000 KB
 
 
题目描述 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 Description

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

输出描述 Output Description

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

样例输入 Sample Input

5

0 2

0 4

1 3

1 2

1 5

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

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

用这题练Treap

插入、删除、前驱、后继

#include<cstdio>
#include<algorithm>
#define mod 1000000
using namespace std;
struct node
{
int key,cnt,fix;
node *lc,*rc;
}*root,*null;
int sum[],ans;
struct TREAP
{
TREAP()
{
null= new node;
null->lc=NULL;
null->rc=NULL;
root=null;
root->fix=0x7fffffff;
}
void rotate_right(node *&now)
{
node *tmp = now->lc;
now->lc = tmp->rc;
tmp->rc = now;
now=tmp;
}
void rotate_left(node *&now)
{
node *tmp = now->rc;
now->rc = tmp->lc;
tmp->lc = now;
now=tmp;
}
void insert(node *&now,int x)
{
if(now==null)
{
now= new node;
now->cnt=;
now->key=x;
now->lc=null;
now->rc=null;
now->fix=rand();
}
else if(now->key > x)
{
insert(now->lc,x);
if( now->lc->fix < now->fix ) rotate_right(now);
}
else
{
insert(now->rc,x);
if(now->rc->fix < now->fix) rotate_left(now);
}
}
int find_pre(int k)
{
int tmp=-;
node *now=root;
while(now!=null)
{
if(now-> key <=k) tmp=now->key,now=now->rc;
else now=now->lc;
}
return tmp;
}
int find_suf(int k)
{
int tmp=-;
node *now = root;
while(now!=null)
{
if(now->key >=k) tmp=now->key,now=now->lc;
else now=now->rc;
}
return tmp;
}
void del(node *&now,int x)
{
if(now->key==x)
{
if(now->lc != null && now->rc != null)
{
if(now->lc->fix < now->rc->fix)
{
rotate_right(now);
del(now->rc,x);
}
else
{
rotate_left(now);
del(now->lc,x);
}
}
else
{
node *tmp=now;
if(now->lc == null) now = now->rc;
else now = now->lc;
delete(tmp);
}
}
else if(now->key < x) del(now->rc,x);
else del(now->lc,x);
}
}Treap;
int main()
{
int n,a,b,pre,suf;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
if(!sum[!a]) Treap.insert(root,b),sum[a]++;
else
{
sum[!a]--;
pre=Treap.find_pre(b);
suf=Treap.find_suf(b);
if(pre==-)
{
ans=(ans+abs(suf-b))%mod;
Treap.del(root,suf);
}
else if(suf==-)
{
ans=(ans+abs(pre-b))%mod;
Treap.del(root,pre);
}
else
{
if(abs(pre-b)<=abs(suf-b))
{
ans=(ans+abs(pre-b))%mod;
Treap.del(root,pre);
}
else
{
ans=(ans+abs(suf-b))%mod;
Treap.del(root,suf);
}
}
}
}
printf("%d\n",ans);
}

HNOI2004 宠物收养所 (Treap)的更多相关文章

  1. bzoj 1208: [HNOI2004]宠物收养所 (Treap)

    链接:  https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...

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

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

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

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

  4. bzoj1208 [HNOI2004]宠物收养所(STL,Treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5956  Solved: 2317[Submit][Sta ...

  5. 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)

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

  6. BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】

    BZOJ1208 HNOI2004 宠物收养所 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的 ...

  7. BZOJ 1208: [HNOI2004]宠物收养所(BST)

    本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...

  8. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Sta ...

  9. bzoj 1208: [HNOI2004]宠物收养所 set

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Sta ...

  10. 数据结构(set):COGS 62. [HNOI2004] 宠物收养所

    62. [HNOI2004] 宠物收养所 ★★★   输入文件:pet.in   输出文件:pet.out   简单对比时间限制:1 s   内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...

随机推荐

  1. 用python脚本计算某一个文件的行数

    python可以统计文件的行数,你相信吗?不管你信不信反正我信了.下面我们来看一下python怎样统计文件的行数,代码很简单,我也做了注释,很简单的实现... 1 2 3 4 5 6 7 8 9 10 ...

  2. jsp取不到值栈的值

    是否页面用的重定向? <result name="addsuccess"  type="redirect"> ? 去掉type="redi ...

  3. 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)

    最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...

  4. fast-IO

    代码: int Scan() //输入外挂 { ,ch,flag=; if((ch=getchar())=='-') flag=; ') res=ch-'; ') res=res*+ch-'; ret ...

  5. 结对项目——fault,error,failure的程序设计

    一.结对编程内容: 1.不能触发Fault. 2.触发Fault,但是不触发Error. 3.触发Error,但不触发Failure. 二.结对编程人员 1.周宗耀.周浩: 2.结对截图: 三.结对项 ...

  6. 软工实践团队展示——WorldElite

    软工实践团队展示--WorldElite 本次作业链接 团队成员 031602636许舒玲(组长) 031602237吴杰婷 031602634吴志鸿 081600107傅滨 031602220雷博浩 ...

  7. CSS自适应导航菜单

    以下是一个简单实例,可以通过学习了解响应工菜单的制作. html <nav class="nav"> <ul> <li class="cur ...

  8. 【bzoj5099】[POI2018]Pionek 双指针法

    题目描述 给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大.求这个最大长度的平方. 输入 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整 ...

  9. 【BZOJ2151】种树(贪心)

    [BZOJ2151]种树(贪心) 题面 BZOJ 题解 如果没有相邻不能选的限制,那么这就是一道傻逼题. 只需要用一个堆维护一下就好了. 现在加上了相邻点的限制,那么我们就对于当前位置加入一个撤销操作 ...

  10. BZOJ2743:[HEOI2012]采花——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2743 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建 ...