正解:$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 ;
}

随机推荐

  1. 项目中遇到的undo表空间不足的替换

    1.查找数据库的UNDO表空间名                                      select name from v$tablespace;                 ...

  2. hdu 2312 Cliff Climbing (pfs)

    Problem - 2312 一条很暴力,有点恶心的搜索.题意其实很简单,主要是pfs的时候拓展结点会有种麻烦的感觉.注意的是,这里的n和m跟平常见到的有所不同,交换过来了.我的代码就是在因为这个长宽 ...

  3. oracle使用DECODE函数来减少处理时间

    使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAM ...

  4. 谷歌浏览器中kindeditor编译器字体不能为微软雅黑的问题?

    https://segmentfault.com/q/1010000006204144 比如说用谷歌浏览器打开后台编译文章,在文章先选择字体为微软雅黑,再编辑其他,哪个字体就变成了&quot: ...

  5. javascript和jquery 移除事件 和 改变样式

    javascript移除事件: document.getElementById("word").onmouseover = null; javascript改变样式: docume ...

  6. mysql基础(库、表相关)

    一. mysql支持的数据类型 1.1 mysql支持的数字类型: TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767 ...

  7. 析构函数 p157

    析构函数 确保对象的各部分被正确的清除,及做一些用户指定的其他清理工作. 当对象超出它的作用域时,编译器将自动调用析构函数:手动用new在堆上分配的对象空间,需要调用'delete 对象地址'进行手动 ...

  8. Vue 父组件往子组件传递方法

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

  9. 降智严重——nowcoder练习赛46&&codeforces #561 Div2

    两场比赛降智不停,熬夜爆肝更掉rating nowcoder: https://ac.nowcoder.com/acm/contest/894#question T1:水题 T2:考虑a和b的子区间! ...

  10. H3C 根据子网数划分子网