题目:

洛谷也能评


题解:

记录一下当前树维护是宠物还是人,用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模板题的更多相关文章

  1. Bzoj 1208: [HNOI2004]宠物收养所(splay)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...

  2. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Sta ...

  3. BZOJ 1208: [HNOI2004]宠物收养所(BST)

    本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...

  4. BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:/ ...

  5. bzoj 1208: [HNOI2004]宠物收养所 set

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Sta ...

  6. bzoj 1208: [HNOI2004]宠物收养所 (Treap)

    链接:  https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...

  7. BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208 题意: 有一个宠物收养所,在接下来一段时间内会陆续有一些宠物进到店里,或是一些人来领 ...

  8. bzoj 1208 HNOI2004宠物收养所 平衡树

    裸平衡树,恢复手感用的 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, ...

  9. 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...

随机推荐

  1. selenium破解极限

    一共分为两端段代码: 第一段:获取cookie 第二段:通过cookie登陆 这里以百度云为例: 第一部分:保存cookies,直接在cmd中执行就好 >>> from seleni ...

  2. Oracle常用傻瓜问题1000问

    Oracle常用傻瓜问题1000问 大家在应用ORACLE的时候可能会遇到很多看起来不难的问题, 特别对新手来说, 今天我简单把它总结一下, 发布给大家, 希望对大家有帮助! 和大家一起探讨, 共同进 ...

  3. python——input()函数

    在使用input()内置函数输入数字时,要注意一点: input()的返回值始终是字符串,所以type(number)永远是<class 'str'>! 如: >>> t ...

  4. [BZOJ1045] [HAOI2008] 糖果传递 (中位数)

    Description 题目链接 Solution 这题跟数列的中位数有关, 具体证明见刘汝佳的蓝皮书里 Code #include <cstdio> #include <algor ...

  5. [BZOJ1927]星际竞速(费用流)

    Description 题意:给定n个点m条边的无向图,只能从编号小的到编号大的,且要求经过所有点刚好一次,而且可以从任意点瞬移到i号点并花费代价Ai,求最小代价. n<=800,m<=1 ...

  6. 5,Linux之文档与目录结构

    Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来 ...

  7. 1-Linux运维人员要求

    linux 运维: 1.linux基础操作命令2.linux基础服务搭建3.文本处理命令4.shell脚本编程 python perl php5.数据库 mysql oracle6.lvs集群 热备 ...

  8. bootstrap设计进度条和圆点

    1.设计进度条.文字前面的圆点和图片 2.思路: (1)设计进度条 (a) 进度条有滚动效果,要加上类.active (b)进度条的颜色通过类.progress-bar-success来写,可以写成. ...

  9. ACE handle_timeout 事件重入

    当多线程运行反应器事件时, 注意handle_timeout会重入,单独线程不存在下列问题! 1. 一个timer事件 // test_ace_timer.cpp : Defines the entr ...

  10. Windows Server 2012 R2有哪些存储监控工具

    [TechTarget中国原创] 大多数Windows管理员都知道,没有一种单一的方法可以用来监控存储或磁盘错误.虽然市场上有无数的管理工具可供你选择,但由于政策和规程的原因,企业之间的选择不尽相同. ...