原文链接http://www.cnblogs.com/zhouzhendong/p/8085803.html


题目传送门 - BZOJ1208


题意概括

  有两种数,依次加入。

  规则为下:

  如果当前剩余的为同种数(或者没有数字),那么直接加入该数。

  否则找到与剩余的数中与当前数差的绝对值最小的(如果有多个一样小的,选择原值最小的),然后ans+=abs(差),并把这两个数都弄没。


题解

  splay裸题。


代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=80005,mod=1000000;
int fa[N],son[N][2],val[N],root,total=0;
void spt_clear(){
root=total=0;
memset(fa,0,sizeof fa);
memset(son,0,sizeof son);
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
if (fa[x]==0)
return;
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (z)
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
}
void splay(int x,int rt){
if (!x)
return;
if (!rt)
root=x;
for (int y=fa[x];fa[x];rotate(x),y=fa[x])
if (fa[y])
rotate(wson(x)==wson(y)?y:x);
}
int findpre(int v,int rt){
if (!rt)
return 0;
if (v==val[rt])
return rt;
if (v>val[rt]){
int x=findpre(v,son[rt][1]);
return x?x:rt;
}
return findpre(v,son[rt][0]);
}
int findpre(int v){
int res=findpre(v,root);
splay(res,0);
return res;
}
int findnxt(int v,int rt){
if (!rt)
return 0;
if (v==val[rt])
return rt;
if (v<val[rt]){
int x=findnxt(v,son[rt][0]);
return x?x:rt;
}
return findnxt(v,son[rt][1]);
}
int findnxt(int v){
int res=findnxt(v,root);
splay(res,0);
return res;
}
int find(int v,int rt){
if (!rt)
return 0;
if (v==val[rt])
return rt;
return find(v,son[rt][v>val[rt]]);
}
int findmax(int rt){
return son[rt][1]?findmax(son[rt][1]):rt;
}
void insert(int v,int &x,int pre){
if (x)
return insert(v,son[x][v>val[x]],x);
fa[x=++total]=pre,val[x]=v;
splay(x,0);
}
void erase(int v){
int x=find(v,root),rt;
splay(x,0);
if (!son[x][0]&&!son[x][1])
return spt_clear();
if (!son[x][0]||!son[x][1]){
int &s=son[x][(bool)son[x][1]];
fa[root=s]=0;
s=0;
return;
}
rt=findmax(son[x][0]);
son[x][0]=fa[son[x][0]]=0;
splay(rt,0);
fa[son[rt][1]=son[x][1]]=rt;
son[x][1]=0;
}
int n,op,v,ans=0,nowop;
int main(){
spt_clear();
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&op,&v);
if (root==0){
nowop=op;
insert(v,root,0);
continue;
}
if (op==nowop)
insert(v,root,0);
else {
int pre=findpre(v),nxt=findnxt(v),cv;
if (!pre)
cv=val[nxt];
else if (!nxt)
cv=val[pre];
else
cv=abs(val[nxt]-v)<abs(v-val[pre])?val[nxt]:val[pre];
ans=(ans+abs(v-cv))%mod;
erase(cv);
}
}
printf("%d",ans);
return 0;
}

  

BZOJ1208 [HNOI2004]宠物收养所 splay的更多相关文章

  1. [bzoj1208][HNOI2004]宠物收养所——splay

    题目大意 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发 ...

  2. BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】

    BZOJ1208 HNOI2004 宠物收养所 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的 ...

  3. 【BZOJ-1208】宠物收养所 Splay

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

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

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

  5. bzoj1208 [HNOI2004]宠物收养所(STL,Treap)

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

  6. 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)

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

  7. 【BZOJ1208】[HNOI2004]宠物收养所 Splay

    还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...

  8. Bzoj1208 [HNOI2004]宠物收养所

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7457  Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...

  9. HNOI2004宠物收养所(splay维护二叉搜索树模板题)

    描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...

随机推荐

  1. lanmp安装

    下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)源码编译安装wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gztar z ...

  2. Django 笔记(六)mysql增删改查

    注:增删改查表数据在 views.py 内 添加表数据: 删表数据:  改表数据:  查表数据: 常用的查询方法: 常用的查询条件: 相当于SQL语句中的where语句后面的条件 语法:字段名__规则

  3. 数据库入门-基本sql语句及数据类型

    一.基本sql语句 SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语言分为3种类型: #.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储 ...

  4. winform无需安装pdf阅读器打开pdf文件

    控件来源:http://www.o2sol.com/pdfview4net/download.htm (使用版本:2016年8月31号更新版) 备份链接: https://pan.baidu.com/ ...

  5. oracle数据库内存调整之增加内存

    注:本文来源:小颜Kevin   <oracle数据库内存调整之增加内存> 模拟操作系统内存从2G增加为8G后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...

  6. phpstudy添加redis扩展

    操作系统   windows: 直接贴步骤记录下 一.      划重点,运行phpinfo(), 观察第四行 x86  好了记住这个 x86 三.    http://pecl.php.net/pa ...

  7. LeetCode(70): 爬楼梯

    Easy! 题目描述: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 ...

  8. UEFI rootkit 工具LoJax可以感染电脑主板(mainboard)

    1.UEFI(Unified Extensible Firmware Interface)统一扩展接口,UEFI rootkit是以在UEFI中植入rootkit ,18年9月份ESET首次公开了境外 ...

  9. python中range()函数的用法

    python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step]) 参数说明: star: 计数从star开始.默认 ...

  10. jenkins+git+maven 增量部署思路以及相关脚本

    之前通过jenkins+Git+maven这种方式打war包然后scp到测试环境使用,但是现在项目组要求打增量包,即只部署修改的文件和配置文件. 核心问题:如何获取到变动的文件??? 前置条件:初始化 ...