【题目链接】

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. Selenium之当鼠标悬浮时隐藏的元素才出现

    在自动化过程中,有些导航按钮只有当鼠标悬浮在登录信息上时,它才能出现.这时候如果想要点击导航按钮直接用selenium的webDriver是无法定位的元素的,因为这些元素是隐藏的,只有鼠标悬浮时才出现 ...

  2. MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度 ...

  3. lua math.random()

    math.random([n [,m]]) 用法:1.无参调用,产生[0, 1)之间的浮点随机数. 2.一个参数n,产生[1, n]之间的整数. 3.两个参数,产生[n, m]之间的整数. math. ...

  4. 高德地图修改gps定位点样式

    效果图 navi_map_gps_locked.png 图片1 图片2 修改 MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化 ...

  5. ubuntu下svn up 出现 Can't convert string from 'UTF-8' to native encoding

    root@ubuntu:/data/www# svn up svn: warning: cannot set LC_CTYPE locale svn: warning: environment var ...

  6. 重载(overload)和重写(override)的对比(笔试经常出)

    Day04_SHJavaTraing_4-6-2017 1.重载(overload):    ①权限修饰符(public private 默认):        无关    ②返回值类型:       ...

  7. VTK读取序列化图像

    vtk获取内存中图像数据 原文链接:http://blog.csdn.net/zmy3376365/article/details/7717721 内存中有段图片数据  ,使用VTK来读入,然后就可以 ...

  8. hibernate用注解配置实体类的映射

    一.注解类 1. @Table 声明了该实体bean映射指定的表(table),目录(catalog)和schema名字 2. @Id 声明了该实体bean的标识属性(对应表中的主键). 3. @Co ...

  9. 【转】【Oracle 集群】Oracle 11G RAC教程之集群安装(七)

    原文地址:http://www.cnblogs.com/baiboy/p/orc7.html 阅读目录 目录 集群安装 参考文献 相关文章 Oracle 11G RAC集群安装(七) 概述:写下本文档 ...

  10. python简单的输入与输出

    1 首先利用python完成简单的输出,运行如下: python和c语言类似,但又有所不同,python开发快,语言简洁,我是这样对比学的 输出:print+空格+'要输出的内容',一定要是英文状态下 ...