BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题
题目:
题解:
记录一下当前树维护是宠物还是人,用Splay维护插入和删除.
对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对值小就好啦
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 800010
#define MOD 1000000
#define which(x) (ls[fa[(x)]]==(x))
typedef long long ll;
using namespace std;
int n,root,tot,val[N],fa[N],ls[N],rs[N],sze[N],cnt[N],flag,op,value;
ll ans;
int read()
{
int ret=,neg=;
char j=getchar();
for (;j>'' || j<'';j=getchar())
if (j=='-') neg=-;
for (;j>='' && j<='';j=getchar())
ret=ret*+j-'';
return ret*neg;
}
void Upt(int x) {sze[x]=sze[ls[x]]+sze[rs[x]]+;}
void Rotate(int u)
{
int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
if (w) which(v)?ls[w]=u:rs[w]=u;
which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
fa[u]=w,fa[v]=u;
if (b) fa[b]=v;
Upt(v),Upt(u);
}
void Splay(int x)
{
while (fa[x])
{
if (fa[fa[x]])
if (which(x)==which(fa[x])) Rotate(fa[x]);
else Rotate(x);
Rotate(x);
}
root=x;
}
void Insert(int x)
{
int cur=root,v=;
while (cur)
if (x<val[v=cur]) cur=ls[cur];
else cur=rs[cur];
fa[++tot]=v,val[tot]=x,sze[tot]=;
if (v) x<val[v]?ls[v]=tot:rs[v]=tot;
Splay(tot);
}
int Find(int x)
{
int cur=root,v=;
while (cur && val[cur]!=x)
if (x<val[v=cur]) cur=ls[cur];
else cur=rs[cur];
return cur?cur:v;
}
int getmin(int x)
{
while (ls[x]) x=ls[x];
return x;
}
int getmax(int x)
{
while (rs[x]) x=rs[x];
return x;
}
int getpre(int x)
{
int u=Find(x);
Splay(u);
if (val[u]<=x) return u;
return getmax(ls[u]);
}
int getnxt(int x)
{
int u=Find(x);
Splay(u);
if (val[u]>=x) return u;
return getmin(rs[u]);
}
void Erase(int x)
{
Splay(x);
if (ls[x]== && rs[x]==) root=;
else
if (ls[x]== || rs[x]==) root=ls[x]+rs[x],fa[root]=;
else{ fa[ls[x]]=;
int v=getmax(ls[x]);
Splay(v);
rs[v]=rs[x],fa[rs[x]]=v,Upt(root);
}
}
int main()
{
n=read();
for (int i=;i<=n;i++)
{
op=read(),value=read();
if (sze[root]==)
Insert(value),flag=op;
else if (op!=flag)
{
int u=getpre(value),v=getnxt(value);
if (u!= && (v== || value-val[u]<=val[v]-value))
ans=(ans+value-val[u])%MOD,Erase(u);
else ans=(ans+val[v]-value)%MOD,Erase(v);
}
else Insert(value);
}
printf("%lld",ans);
return ;
}
BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题的更多相关文章
- Bzoj 1208: [HNOI2004]宠物收养所(splay)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7514 Solved: 2982[Submit][Sta ...
- BZOJ 1208: [HNOI2004]宠物收养所(BST)
本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...
- BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:/ ...
- bzoj 1208: [HNOI2004]宠物收养所 set
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7328 Solved: 2892[Submit][Sta ...
- bzoj 1208: [HNOI2004]宠物收养所 (Treap)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...
- BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208 题意: 有一个宠物收养所,在接下来一段时间内会陆续有一些宠物进到店里,或是一些人来领 ...
- bzoj 1208 HNOI2004宠物收养所 平衡树
裸平衡树,恢复手感用的 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, ...
- 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...
随机推荐
- NPM 学习笔记整理
NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...
- CBCGPImage的GetSize的问题及解决方法
BCGControlBar Pro for MFC 25.10是目前(2018-07-16)网上能够找到的最新能够使用的版本,我配合Visual Studio 2010使用.在单文档MFC程序的视图中 ...
- Linux Kernel ---- PCI Driver 分析
自己笔记使用. Kernel 版本 4.15.0 (ubuntu 18.04,intel skylake) 最近想学习VGA驱动去了解 DDCCP / EDID 等协议,然后顺便了解下驱动是如何工作的 ...
- 正则表达式re.S的用法
正则表达式re.S的用法 在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下 ...
- 笔记-python-lib-chardet
笔记-python-lib-chardet 1. chardet chardet是一个非常优秀的编码识别模块, 是python的第三方库,需要下载和安装. 文档地址:https://pypi ...
- Android 游标
静下心来,学一下Android的数据库连接. 1.直接从getReadableDatabase()与getWritableDatabase()入手. --getReadableDatabase( ...
- MVC WebAPI 的基本使用
1.什么是WebAPI Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 它可以 ...
- P2985 [USACO10FEB]吃巧克力Chocolate Eating
P2985 [USACO10FEB]吃巧克力Chocolate Eating 题目描述 Bessie has received N (1 <= N <= 50,000) chocolate ...
- Android 人脸识别
Android人脸识别技术,可以参考下面的网站. http://www.faceplusplus.com.cn/ 本项目使用的就是该网站的api. 项目具体使用的技术代码 /** * 用来压缩图片的方 ...
- Windows系统搭建Mysql Cluster集群
简单介绍一下MySQL集群涉及的三种节点: 管理节点(也可以称管理服务器)是整个集群环境的核心,类似于集群中起调度作用的枢纽,由它来负责管理其它节点(数据节点和SQL节点)的开启.关闭或重启某 ...