【题目链接】

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. mysql基础知识点梳理

    ##本单元目标 一.为什么要学习数据库 二.数据库的相关概念DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍MySQL产品的安装 ★MySQL服务的启动和停止 ...

  2. Docker 内部之间的网络连接

    一.简介 内部网络连接的2中方式: Docker NetWorking (1.9版本之后推荐使用这个)和 Docker link(1.9 版本之前都使用这个) 推荐使用docker networkin ...

  3. 10.2&10.3 Xcode开发包

    10.2开发包下载链接 10.3开发包下载链接 Finder打开后,按command+shift+G前往这个地址: /Applications/Xcode.app/Contents/Developer ...

  4. Oracle表的种类及定义

    1表的类型 1)堆组织表(heap organized tables). 当增加数据时,将使用在段中找到的第一个适合数据大小的空闲空间.当数据从表中删除时,留下的空间允许随后的insert和updat ...

  5. 【Oracle】DBA_AUDIT_TRAIL表SES_ACTIONS字段对应的操作列表

    SES_ACTIONS字段共包含16个字符,初始状态都为“-”,当被审计的对象被操作后,SES_ACTIONS会在相应的位置作出标识,标识为“S”的代表操作成功,标识为“F”的代表操作失败,16个位置 ...

  6. 从Spark1.6到Spark2.1,Logging该何去何从

    大家都知道spark 1.6.0版本比较稳定,也比较流行. 我们项目组也是,最初用的就是这个版本. 这段时间,项目组引入spark 2.1.0版本,我想尝尝鲜. Pom中刚刚换了dependency马 ...

  7. 改造PAXOS算法消灭活锁

    分布式一致性协议的目的是确定一个不可变变量分布式存储的取值:通过对国内外一致性算法的研究成果和PAXOS协议活锁的分析,发现引入一个角色作为竞争时的代理提交者就可以解决活锁问题,从而在本文引入“代理提 ...

  8. 互联网的大数据神话——NoSQL

    本文摘抄于:<纵横大数据--云计算数据基础设施> 何小朝著 Chapter5. NewSQL--关系数据库联邦/联合 5.4.2  互联网的神话 对强一致性的要求放松,是因为 互联网的分布 ...

  9. nyoj48-小明的调查作业

    48-小明的调查作业 内存限制:64MB时间限制:1000msSpecial Judge: No accepted:3submit:4 题目描述: 小明的老师布置了一份调查作业,小明想在学校中请一些同 ...

  10. C#强化系列:HttpModule,HttpHandler,HttpHandlerFactory简单使用

    这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用.HttpModule:Http模块,可以在页面处理前后.应用 ...