【HNOI 2004】宠物收养所
【题目链接】
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】宠物收养所的更多相关文章
- [HNOI 2004]宠物收养场
Description 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的 ...
- LOJ10144宠物收养所
HNOI 2004 最近,阿 Q 开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,阿 Q 根据领养者的要求通过他自己发明的 ...
- Bzoj1208 [HNOI2004]宠物收养所
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7457 Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7514 Solved: 2982[Submit][Sta ...
- 宠物收养所(bzoj1208)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- 【BZOJ1208】[HNOI2004]宠物收养所 Splay
还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...
- 【BZOJ-1208】宠物收养所 Splay
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6638 Solved: 2601[Submit][Sta ...
- BZOJ1208 宠物收养所
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- C++之路进阶——codevs1285(宠物收养所)
1285 宠物收养所 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服 ...
- bzoj 1208: [HNOI2004]宠物收养所 set
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7328 Solved: 2892[Submit][Sta ...
随机推荐
- Solr.NET快速入门(三)【高亮显示】
此功能会"高亮显示"匹配查询的字词(通常使用标记),包括匹配字词周围的文字片段. 要启用高亮显示,请包括HighlightingParameters QueryOptions对象, ...
- python课程设计笔记(四)整数、浮点数与字符串 time库
整数类型(范围无限制) 十进制1 -1 二进制0b1 -0b1 八进制0o1 -0o1 十六进制0x1 -0x1 浮点类型(范围有限制但可忽略) 运算存在不确定尾数 :0.1+0.2!=0.3 原因: ...
- OrmLite:no such table: tb_name
卸载原安装程序,从新安装(感觉是因为已经存在数据库,所以不执行创建.)
- JavaScript私有方法
some concepts: Java is from Sun Microsystem Inc., and JavaScript, called LiveScript before, is from ...
- Spring AOP理解
Spring的核心思想的IOC和AOP.最近学习AOP,对切面的学习有了进一步的认识. Spring用代理类包裹切面,把他们织入到Spring管理的bean中.也就是说代理类伪装成目标类,它会截取对目 ...
- Visual Studio 编辑代码量大的文件时分屏技巧
- 7.5.5编程实例-Bezier曲线曲面绘制
(a)Bezier曲线 (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...
- RxSwift學習教程之基礎篇
前言 我們在 iOS 開發過程中,幾乎無時無刻都要面對異步事件的處理.例如,按鍵點擊.數據保存..音頻後臺播放.交互動畫展示.這些事件並不具備特定時序性,甚至它們可能同時發生. 雖然 Apple 提供 ...
- ajax发送请求是图标转圈圈实现
css部分 .load-img{ //控制图标大小width:40px;height:40px;margin:100px;border-radius:50%;-webkit-animation:cir ...
- 洛谷P1466 集合 Subset Sums_01背包水题
不多解释,适当刷刷水… Code: #include<cstdio> #include<algorithm> using namespace std; const int ma ...