洛谷$P$2286 宠物收养场 $[HNOI2004]$ $splay$
正解:$splay$
解题报告:
$splay$板子,,,?
先考虑这题要实现些什么东西嘛$QwQ$
其实只要实现一个东西?就查询数列中与给定数字相差最小的数,显然用$splay$查询前驱后继,然后就没辣,,,?(哦还一个$insert$,,,$QwQ$
记得分类讨论下是人有剩还是宠物有剩就好,$over$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char const int N=1e5,mod=,inf=1e9;
int rt,n,cnt=,nod_cnt,as,a,b;
struct nod{int ch[],val,sz,fa;il void pre(ri x,ri fat){ch[]=ch[]=;val=x;sz=;fa=fat;}}tr[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void pushup(ri x){tr[x].sz=tr[tr[x].ch[]].sz+tr[tr[x].ch[]].sz+;}
il void rotate(ri x)
{
ri fa=tr[x].fa,grdfa=tr[fa].fa;rb op1=tr[fa].ch[]==x,op2=tr[grdfa].ch[]==fa;
tr[grdfa].ch[op2]=x;tr[x].fa=grdfa;
tr[fa].ch[op1]=tr[x].ch[op1^];tr[tr[x].ch[op1^]].fa=fa;
tr[fa].fa=x;tr[x].ch[op1^]=fa;
pushup(fa);pushup(x);
}
il void splay(ri x,ri goal)
{
if(!x)return;
while(tr[x].fa!=goal)
{
ri fa=tr[x].fa,grdfa=tr[fa].fa;
if(grdfa!=goal)(tr[fa].ch[]==x)^(tr[grdfa].ch[]==fa)?rotate(x):rotate(fa);
rotate(x);
}
if(!goal)rt=x;
}
il void insert(ri x)
{
ri nw=rt,fa=;
while(nw)fa=nw,nw=tr[nw].ch[tr[nw].val<x];
nw=++nod_cnt;if(fa)tr[fa].ch[tr[fa].val<x]=nw;tr[nw].pre(x,fa);
splay(nw,);
}
il void fd(ri x)
{
ri nw=rt;if(!rt)return;
while(tr[nw].ch[x>tr[nw].val] && x!=tr[nw].val)nw=tr[nw].ch[x>tr[nw].val];
splay(nw,);
}
il int ask_pr(ri x)
{
fd(x);ri nw=rt;
if(tr[nw].val<=x)return nw;
nw=tr[nw].ch[];
while(tr[nw].ch[])nw=tr[nw].ch[];
return nw;
}
il int ask_lst(ri x)
{
fd(x);ri nw=rt;
if(tr[nw].val>=x)return nw;
nw=tr[nw].ch[];
while(tr[nw].ch[])nw=tr[nw].ch[];
return nw;
}
il int ask_pr_yg(ri x)
{
fd(x);ri nw=rt;
if(tr[nw].val<x)return nw;
nw=tr[nw].ch[];
while(tr[nw].ch[])nw=tr[nw].ch[];
return nw;
}
il int ask_lst_yg(ri x)
{
fd(x);ri nw=rt;
if(tr[nw].val>x)return nw;
nw=tr[nw].ch[];
while(tr[nw].ch[])nw=tr[nw].ch[];
return nw;
}
il void delet(ri x)
{
ri pr=ask_pr_yg(x),lst=ask_lst_yg(x);
splay(pr,);splay(lst,pr);
tr[tr[rt].ch[]].ch[]=;
} int main()
{
// freopen("2286.in","r",stdin);freopen("2286.out","w",stdout);
n=read();insert(inf);insert(-inf);
while(n--)
{
cnt+=a?:-;a=read(),b=read();
if(!cnt){insert(b);continue;}
if(cnt>)
{
if(a){insert(b);continue;}
ri pr=ask_pr(b),lst=ask_lst(b);
if(abs(tr[lst].val-b)<abs(b-tr[pr].val))
{
as+=abs(tr[lst].val-b);as%=mod;
delet(tr[lst].val);
}
else
{
as+=abs(b-tr[pr].val);as%=mod;
delet(tr[pr].val);
}
}
else
{
if(!a){insert(b);continue;}
ri pr=ask_pr(b),lst=ask_lst(b);
if(abs(tr[lst].val-b)<abs(b-tr[pr].val))
{
as+=abs(tr[lst].val-b);as%=mod;
delet(tr[lst].val);
}
else
{
as+=abs(b-tr[pr].val);as%=mod;
delet(tr[pr].val);
}
}
}
printf("%d\n",as);
return ;
}
随机推荐
- 创建我的flask第一个应用(一)
本地python版本 (venv) dongge@dongge-PC:/data/webroot$ python --version Python 3.6.5 创建flask命令 $mkdir myp ...
- oracle函数 NLS_INITCAP(x[,y])
[功能]返回字符串并将字符串的第一个字母变为大写,其它字母小写; [参数]x字符型表达式 [参数]Nls_param可选, 查询数据级的NLS设置:select * from nls_database ...
- python特性(八):生成器对象的send方法
生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...
- day6_python之pickle、shelve序列化和反序列化
pickle.shelve,python私有,支持所有python数据类型 一.pickle dic={'name':'egon','age':18} print(pickle.dumps(dic)) ...
- centos安装hdp
1. 准备6和7的 YUM源包 1.1 centos 下载后解压到同一个目录 http://mirrors.163.com/centos/6/isos/x86_64/CentOS-6.9-x86_64 ...
- codeforces1249-div3
A B C 等比数列的性质,前面的i项的和,不会超过第i+1项 D 有若干个区间,要求每一个点被区间覆盖的次数不能超过k个.问移除的最少的区间的数目. 贪心: 若某个点被覆盖了k次以上,那么肯定是移除 ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
- 洛谷P4860 Roy&October之取石子II 题解 博弈论
题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被 ...
- C# 比较两张图片是否完全相同
本文演示如何比较两张图片是否完全相同. (注意:如果是比较两张图片是否相似,则比较复杂,涉及到机器学习) 方法一:把图片保存到内存流中,然后转化成 Base64 字符串进行比较 using Syste ...
- Cisco 交换机笔记
最近使用 Cisco L3(C3560X), L2(2960) 交换机搭建了 VLAN 环境,其中包括了 VLAN 的配置, VLAN 间的路由等,在此写篇笔记记录下. VLAN 结构 L3 Swit ...