1208: [HNOI2004]宠物收养所

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 7589  Solved: 3009
[Submit][Status][Discuss]

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
(abs(3-2) + abs(2-4)=3,最后一个领养者没有宠物可以领养)

HINT

Source

裸的splay 结果又打错了

#include<cstdio>
#include<cstring>
using namespace std;
#define N 80010
int n,x1,x2,root,ans,cnt;
int fa[N],child[N][],key[N];
bool flag;
int abs(int x)
{
return x<?-x:x;
}
void zig(int x)
{
int y=fa[x];
fa[x]=fa[y];
child[fa[x]][y==child[fa[x]][]]=x;
fa[child[x][]]=y; child[y][]=child[x][];
fa[y]=x; child[x][]=y;
}
void zag(int x)
{
int y=fa[x];
fa[x]=fa[y]; child[fa[x]][y==child[fa[x]][]]=x;
fa[child[x][]]=y; child[y][]=child[x][];
fa[y]=x; child[x][]=y;
}
void splay(int x)
{
while(fa[x])
{
int y=fa[x],z=fa[y];
if(y==root)
{
if(x==child[y][]) zig(x); else zag(x);
break;
}
else if(x==child[y][]&&y==child[z][]) {zig(x); zig(x);}
else if(x==child[y][]&&y==child[z][]) {zig(x); zag(x);}
else if(x==child[y][]&&y==child[z][]) {zag(x); zig(x);}
else if(x==child[y][]&&y==child[z][]) {zag(x); zag(x);}
}
root=x;
}
void insert(int&x,int val,int last)
{
if(!x)
{
x=++cnt;
key[x]=val;
fa[x]=last;
splay(cnt);
}
else if(val>key[x]) insert(child[x][],val,x);
else insert(child[x][],val,x);
}
void erase(int x)
{
splay(x);
if(child[x][]*child[x][]==)
{
root=child[x][]+child[x][];
}
else
{
int k=child[x][];
while(child[k][]) k=child[k][];
child[k][]=child[x][]; fa[child[x][]]=k;
root=child[x][];
}
fa[root]=;
}
void findpro(int x,int k)
{
// printf("x=%d\n",x);
// printf("child[x][0]=%d\n",child[x][0]);
// printf("child[x][1]=%d\n",child[x][1]);
if(!x) return;
if(key[x]<k)
{
x1=x; findpro(child[x][],k);
} else findpro(child[x][],k);
}
void findnxt(int x,int k)
{
if(!x) return;
if(key[x]>k)
{
x2=x; findnxt(child[x][],k);
} else findnxt(child[x][],k);
}
int main()
{
//flag=true:有人
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int opt,a; scanf("%d%d",&opt,&a);
x1=x2=-;
if(opt==)
{
if(flag&&root)
{
findpro(root,a); findnxt(root,a);
if(x1==-&&x2==-) continue;
if((a-key[x1]<=key[x2]-a&&x1!=-)||x2==-)
{
ans+=abs(a-key[x1]);
ans%=;
// printf("x1=%d\n",x1);
erase(x1);
}
else if(x2!=-)
{
ans+=abs(a-key[x2]);
ans%=;
// printf("x2=%d\n",x2);
erase(x2);
}
}
else if(!root||!flag)
{
flag=false;
insert(root,a,);
// printf("key=%d\n",key[cnt]);
}
}
else
{
if(!flag&&root)
{
findpro(root,a);
findnxt(root,a);
if(x1==-&&x2==-) continue;
if((a-key[x1]<=key[x2]-a&&x1!=-)||x2==-)
{
ans+=abs(a-key[x1]);
ans%=;
// printf("x1=%d\n",x1);
erase(x1);
}
else if(x2!=-)
{
ans+=abs(a-key[x2]);
ans%=;
// printf("x2=%d\n",x2);
erase(x2);
}
}
else if(!root||flag)
{
flag=true;
insert(root,a,);
}
}
// printf("root=%d\n",root);
// printf("ans=%d\n",ans);
}
printf("%d",ans);
return ;
}

bzoj1208的更多相关文章

  1. 【BZOJ1208】宠物收养所(平衡树,splay)

    题意:见题面 思路:因为每个时刻要么全是人要么全是宠物,所以可以一棵splay解决 维护单点插入,单点删除,求前驱,求后继即可 ..,..]of longint; num,fa:..]of longi ...

  2. BZOJ1208 [HNOI2004]宠物收养所 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8085803.html 题目传送门 - BZOJ1208 题意概括 有两种数,依次加入. 规则为下: 如果当前剩余 ...

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

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

  4. 【BZOJ1208】宠物收养所(splay)

    题意:见题面 思路:因为每个时刻要么全是人要么全是宠物,所以可以一棵splay解决 维护单点插入,单点删除,求前驱,求后继即可 ..,..]of longint; num,fa:..]of longi ...

  5. Bzoj1208 [HNOI2004]宠物收养所

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7457  Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...

  6. 宠物收养所(bzoj1208)

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

  7. 【BZOJ1208】[HNOI2004]宠物收养所 Splay

    还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...

  8. 【BZOJ-1208】宠物收养所 Splay

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

  9. BZOJ1208 宠物收养所

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

随机推荐

  1. RoboGuice 3.0 (一)入坑篇

    RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...

  2. git rebase与 git合并(error: failed to push some refs to)解决方法

    1.遇到的问题 本地有一个git仓库,在github上新建了一个空的仓库,但是更新了REWADME.md的信息,即在github上多了一个提交. 关联远程仓库,操作顺序如下: git remote a ...

  3. Linux make: g++: Command not found

    Linux使用make命令时遇到"make: g++: Command not found",这个主要是没有安装gcc-c++.x86_64,如下所示   [root@localh ...

  4. 【转】深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    [原文]:http://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.    ...

  5. c#中对txt文件的读取与写入,针对二维数组

    class Program { ; ; static string[,] str = new string[ROW, COL]; static void Main(string[] args) { R ...

  6. hadoop2.2.0伪分布式搭建3--安装Hadoop

    3.1上传hadoop安装包 3.2解压hadoop安装包 mkdir /cloud #解压到/cloud/目录下 tar -zxvf hadoop-2.2.0.tar.gz -C /cloud/ 3 ...

  7. ELF Format 笔记(十三)—— 段权限

    ilocker:关注 Android 安全(新手) QQ: 2597294287 一个可被系统加载的程序至少拥有一个可加载段.当系统创建可加载段的内存映像时,会根据 p_flags 赋予一定的访问权限 ...

  8. 【2016-11-6】【坚持学习】【Day21】【子窗口关闭时,同步关闭它的主窗口(方法二)】

    根据上文,在子窗口设置一个委托.然后在子窗口关闭事件,执行委托实例,然后在主窗口增加监听委托的方法.... 想想,本事关闭事件就是一个特殊的委托.那么干嘛还要特意去声明一个新的呢?多此一举. 于是有下 ...

  9. PYTHON解析XML的多种方式效率对比实测

    在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...

  10. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...