【题目链接】

https://www.lydsy.com/JudgeOnline/problem.php?id=1208

【算法】

建两棵平衡树维护领养者和宠物的特点值,这两棵平衡树支持 插入删除,查询前驱和后继

笔者的平衡树选用的是Treap,当然,Splay,Set等数据结构也是可以完成这个任务的

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 80010
typedef long long ll;
const ll INF = 1e15;
const int P = ; int i,n,ans,a;
ll p,q,b; struct Treap
{
int root,total;
struct Node
{
int l,r;
int priority;
ll val;
} a[MAXN];
inline void new_node(int pos,ll x)
{
a[pos].priority = rand();
a[pos].val = x;
}
inline void zig(int &p)
{
int q = a[p].l;
a[p].l = a[q].r; a[q].r = p;
p = q;
}
inline void zag(int &p)
{
int q = a[p].r;
a[p].r = a[q].l; a[q].l = p;
p = q;
}
inline void insert(int &x,ll val)
{
int now;
if (!root)
{
new_node(++total,val);
root = total;
return;
}
if (val < a[x].val)
{
if (a[x].l)
{
insert(a[x].l,val);
if (a[a[x].l].priority > a[x].priority) zig(x);
} else
{
new_node(++total,val);
a[x].l = total;
}
} else
{
if (a[x].r)
{
insert(a[x].r,val);
if (a[a[x].r].priority > a[x].priority) zag(x);
} else
{
new_node(++total,val);
a[x].r = total;
}
}
}
inline void erase(int &x,ll val)
{
if (x == ) return;
if (a[x].val == val)
{
if (a[x].l || a[x].r)
{
if (a[x].r == || a[a[x].l].priority > a[a[x].r].priority)
{
zig(x);
erase(a[x].r,val);
} else
{
zag(x);
erase(a[x].l,val);
}
} else x = ;
} else
{
if (val < a[x].val) erase(a[x].l,val);
else erase(a[x].r,val);
}
}
inline ll pred(int x,ll val)
{
ll t;
if (!x) return -INF;
if (a[x].val == val) return val;
if (val > a[x].val)
{
t = pred(a[x].r,val);
return (t == -INF) ? a[x].val : t;
} else return pred(a[x].l,val);
}
inline ll succ(int x,ll val)
{
ll t;
if (!x) return INF;
if (a[x].val == val) return val;
if (val < a[x].val)
{
t = succ(a[x].l,val);
return (t == INF) ? a[x].val : t;
} else return succ(a[x].r,val);
}
} T1,T2; int main()
{ srand();
scanf("%d",&n);
for (i = ; i <= n; i++)
{
scanf("%d%lld",&a,&b);
if (a == )
{
if (T2.root)
{
p = T2.pred(T2.root,b);
q = T2.succ(T2.root,b);
if (p == -INF && q == INF) continue;
if (b - p <= q - b)
{
T2.erase(T2.root,p);
ans = (ans + b - p) % P;
}
else
{
T2.erase(T2.root,q);
ans = (ans + q - b) % P;
}
} else T1.insert(T1.root,b);
} else
{
if (T1.root)
{
p = T1.pred(T1.root,b);
q = T1.succ(T1.root,b);
if (p == -INF && q == INF) continue;
if (b - p <= q - b)
{
T1.erase(T1.root,p);
ans = (ans + b - p) % P;
}
else
{
T1.erase(T1.root,q);
ans = (ans + q - b) % P;
}
} else T2.insert(T2.root,b);
}
}
printf("%d\n",ans); return ;
}

【HNOI 2004】宠物收养所的更多相关文章

  1. [HNOI 2004]宠物收养场

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

  2. LOJ10144宠物收养所

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

  3. Bzoj1208 [HNOI2004]宠物收养所

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

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

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

  5. 宠物收养所(bzoj1208)

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

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

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

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

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

  8. BZOJ1208 宠物收养所

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

  9. C++之路进阶——codevs1285(宠物收养所)

    1285 宠物收养所  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服 ...

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

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

随机推荐

  1. java异常处理和自定义异常利用try和catch让程序继续下去(回来自己再写个例子试运行下)

    注意:想在catch的参数里使用自定义的异常,则必须先将这个异常抛出才行.(throws是具有抛出异常的能力,并未抛出,throw new MyException是抛出异常,catch是捕获异常,只有 ...

  2. resgen.exe 已退出 代码为 1073741701的错误的解决办法

    以管理员的身份打开命令提示窗口:(开始-运行-cmd),更改目录至"CD C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\”下 ...

  3. javascript实现双击网页自动滚动,单击滚动停止

    当网页中有长篇文章时,浏览起来就比较吃劲了,想想一边忙着拖动滚动条,一边忙着浏览,确实挺累人的.为了客人能够轻松的浏览,我们可以使用script代码实现网页的自动滚屏,当双击网页的时候,网页将会自动向 ...

  4. Cython入门.VS.C++

    原文链接:http://blog.csdn.net/gzlaiyonghao/article/details/4561611 作者:perrygeo 译者:赖勇浩(http://laiyonghao. ...

  5. mysql 各项操作流程

    启动mysql:进入命令行输入:net start mysql 如果失败则显示:服务名无效,需跳转到指定Bin目录下进行启动mysql, 成功则进行下一步:登陆 :mysql -uroot -proo ...

  6. Jquery中拿到相同的对应的所有的标签

    在Jquery中相同的ID号不能用$()获得,即使是$().each()也不能获得所有的ID相同的元素,只能获得第一个匹配的元素. 比如: 以上4个div,如果用$("#jevoly&quo ...

  7. chrome中自动回填表单解决

    input添加属性autocomplete="new-password"

  8. Python中的多个装饰器装饰一个函数

    def wrapper1(func1): def inner1(): print('w1 ,before') func1() print('w1 after') return inner1 def w ...

  9. UGUI实现打字的效果

    创建打字特效控制的脚本,将该脚本挂载都含有Text组件的对象上面,通过该脚本控制Text文本框的文字,以打字的效果显示文字. 脚本 using UnityEngine; using System.Co ...

  10. 微信小程序:获取地理定位和显示相应的城市名称。

    最近在看微信小程序,遇到地理定位显示城市名称的问题.本文就是记录这一过程. 解决方案                                                          ...