BZOJ1208 [HNOI2004]宠物收养所 splay
原文链接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的更多相关文章
- [bzoj1208][HNOI2004]宠物收养所——splay
题目大意 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发 ...
- BZOJ1208 HNOI2004 宠物收养所 【非旋转Treap】
BZOJ1208 HNOI2004 宠物收养所 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的 ...
- 【BZOJ-1208】宠物收养所 Splay
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6638 Solved: 2601[Submit][Sta ...
- Bzoj 1208: [HNOI2004]宠物收养所(splay)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- bzoj1208 [HNOI2004]宠物收养所(STL,Treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5956 Solved: 2317[Submit][Sta ...
- 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- 【BZOJ1208】[HNOI2004]宠物收养所 Splay
还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...
- Bzoj1208 [HNOI2004]宠物收养所
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7457 Solved: 2960 Description 最近,阿Q开了一间宠物收养所.收养所提供两 ...
- HNOI2004宠物收养所(splay维护二叉搜索树模板题)
描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...
随机推荐
- poj1562 Oil Deposits 深搜模板题
题目描述: Description The GeoSurvComp geologic survey company is responsible for detecting underground o ...
- java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规 ...
- idea 去除xml文件sql语句背景色
怎么看idea mapper.xml中写sql语句的那种屎黄屎黄背景颜色不好看 去除背景色 把这两项勾选去掉,然后 把这个背景勾选也去掉,最后 把这个勾选也去掉 另一种方式: 也可以使用这种方式 al ...
- 查看MySQL版本的命令及常用命令
Windows / Linux 系统 前提是已经正确安装了 MySQL,打开 Windows 系统中的命令行工具(Win + R --> 输入 cmd 并按下回车键)--> 输入命令: m ...
- Confluence 6 重新获得站点备份文件
Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中.你需要自己访问你安装的 Confluence 服务 ...
- Confluence 6 新安装配置数据库字符集编码
Confluence 和你的数据库必须配置使用相同的字符集. Confluence 使用 UTF-8 字符集编码,所以你的数据库也必须配置为使用 UTF-8 (或者与 UTF-8 相同的编码,例如在 ...
- Confluence 6 上传站点图标后重置你的配色方案
当你上传一个站点标识图片后,Confluence 会根据你上传的图片文件自动侦测使用的颜色,并为你设置自动配色方案. 你可以按照上面描述的方法修改色彩配色方案,或者你也可以重置配色方案为默认的配色方案 ...
- Confluence 6 修改站点图标(favicon)
你也可以修改你站点的图标(这个站点图标将会在你浏览器的标签页上显示).你需要 Confluence 的管理员权限才能进行修改. 进入 > 基本配置(General Configuration) ...
- IOS 命令行工具开发
例子 我们需要查看手机APP里面的某个应用的架构 新建一个Single View App 的ios项目 ToolCL 然后在 main函数中加入以下代码 // // main.m // ToolCL ...
- 移动端点击出现阴影 css解决方案
a,img,button,input,textarea,div{-webkit-tap-highlight-color:rgba(255,255,255,0);}