【题目链接】

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. C - Twins(贪心)

    Problem description Imagine that you have a twin brother or sister. Having another person that looks ...

  2. APM技术原理

    链接地址:http://www.infoq.com/cn/articles/apm-Pinpoint-practice 1.什么是APM? APM,全称:Application Performance ...

  3. JAVA基本数据类型转换的注意事项

    JAVA中基本数据类型: 类型: 字节: 范围: 默认值: byte 1 -128~127 0 short 2 -32768~32767 0 char 2 0~65535 '\u0000' int 4 ...

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

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

  5. javascript中异常处理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 检查点和SCN

    有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一旦粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(buffer ca ...

  7. 点击之后连接qq

    <a class=" "   style=""  href="http://wpa.qq.com/msgrd?v=3&uin=40482 ...

  8. word2016如何英汉互译

    1.如果是一篇英文文档且是pdf格式,可以用word2016打开直接转化成了word,就算不是会员也可以的,在此附上16版的光盘安装包,可以百度自行下载 (链接:https://pan.baidu.c ...

  9. centos7 修改默认语言

    vi /etc/locale.conf # 修改成英文 LANG="en_US.UTF-8" # 修改成中文 LANG="zh_CN.UTF-8"

  10. UVA455 - Periodic Strings(紫书习题3.4)

    如果一个字符串可以被某个长度为k的字符串重复多次得到,则称这个字符串的周期为k.例如,字符串"abcabcabcabc"以3为周期(当然,他也以6.12等等为周期).  现在请你编 ...