洛谷$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 ;
}
随机推荐
- Laravel 下的伪造跨站请求保护 CSRF#
简介# Laravel 可以轻松地保护应用程序免受跨站请求伪造(CSRF) 的攻击.跨站请求伪造是一种恶意的攻击, 他凭借已通过身份验证的用户身份来运行未经过授权的命令. Laravel 会自动为每个 ...
- Redis源码解析:03字典
字典是一种用于保存键值对(key value pair)的抽象数据结构.在字典中,一个键和一个值进行关联,就是所谓的键值对.字典中的每个键都是独一无二的,可以根据键查找.更新值,或者删除整个键值对等等 ...
- 3331: [BeiJing2013]压力
3331: [BeiJing2013]压力 LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没 ...
- @codeforces - 708D@ Incorrect Flow
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...
- 小程序clearinterval无效解决
小程序clearinterval无效解决 小程序clearinterval清除定时器无效,原因是定时器使用与清除方法不对导致的,我们应将定时器绑定变量,这样在关闭页面清空定时器clearinterva ...
- HDU 1596 也是最小路径Dijkstra
#include<cstdio> #include<cmath> #include<cstring> +; double dist[qq]; double city ...
- [转载] 虚拟机3种网络模式(NAT, Host-only, Bridged)
实例讲解虚拟机3种网络模式(桥接.nat.Host-only) 转载自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html ...
- 2019-9-9-dotnet-获取本机-IP-地址方法
title author date CreateTime categories dotnet 获取本机 IP 地址方法 lindexi 2019-09-09 15:56:33 +0800 2019-0 ...
- 教你如何成为Spark大数据高手?
教你如何成为Spark大数据高手? Spark目前被越来越多的企业使用,和Hadoop一样,Spark也是以作业的形式向集群提交任务,那么如何成为Spark大数据高手?下面就来个深度教程. Spark ...
- ios9.3.3 h5的js代码全部失效
做微信公众号页面时,ios9.3.3 h5的js代码全部失效描述: 机型iphone6 plus,ios9.3.3js代码全部失效,刚开始还以为是ios和jq兼容问题, 后来发现是es6语法不能读,导 ...