BZOJ 1208 宠物收养所 | 平衡树模板题
BZOJ 1208 宠物收养所
我犯过的错误:删除一个节点后没有update新的根节点,导致size错了!
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 80005, P = 1000000;
int n, flag, root, idx, fa[N], ls[N], rs[N], sze[N], val[N];
ll ans;
#define which(u) (ls[fa[(u)]] == (u))
void debug(){
printf("root = %d\n", val[root]);
for(int i = 1; i <= idx; i++)
printf("val = %d, fa = %d, ls = %d, rs = %d, sze = %d\n", val[i], val[fa[i]], val[ls[i]], val[rs[i]], sze[i]);
}
void upt(int u){
sze[u] = sze[ls[u]] + sze[rs[u]] + 1;
}
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 u, int tar){
while(fa[u] != tar){
if(fa[fa[u]] != tar){
if(which(u) == which(fa[u])) rotate(fa[u]);
else rotate(u);
}
rotate(u);
}
if(!tar) root = u;
}
void insert(int x){
int u = root, v = 0;
while(u){
v = u;
if(x < val[u]) u = ls[u];
else u = rs[u];
}
fa[++idx] = v, val[idx] = x, sze[idx] = 1;
if(v) x < val[v] ? ls[v] = idx : rs[v] = idx;
splay(idx, 0);
}
int find(int x){
int u = root, v = 0;
while(u && val[u] != x){
v = u;
if(x < val[u]) u = ls[u];
else u = rs[u];
}
return u ? u : v;
}
int getmin(int u){
while(ls[u]) u = ls[u];
return u;
}
int getmax(int u){
while(rs[u]) u = rs[u];
return u;
}
int getpre(int x){
int u = find(x);
splay(u, 0);
if(val[u] <= x) return u;
else return getmax(ls[u]);
}
int getnxt(int x){
int u = find(x);
splay(u, 0);
if(val[u] >= x) return u;
else return getmin(rs[u]);
}
void erase(int u){
splay(u, 0);
if(sze[u] == 1) root = 0;
else if(!ls[u] || !rs[u]) root = ls[u] + rs[u], fa[root] = 0;
else{
fa[ls[u]] = 0;
int v = getmax(ls[u]);
splay(v, 0);
rs[v] = rs[u], fa[rs[u]] = v, upt(root);
}
}
int main(){
read(n);
while(n--){
int op, x;
read(op), read(x);
if(!sze[root]){
insert(x);
flag = op;
}
else if(flag ^ op){
int u = getpre(x), v = getnxt(x);
if(u && (!v || x - val[u] <= val[v] - x))
ans = (ans + (x - val[u]) % P) % P, erase(u);
else
ans = (ans + (val[v] - x) % P) % P, erase(v);
}
else insert(x);
}
write(ans), enter;
return 0;
}
BZOJ 1208 宠物收养所 | 平衡树模板题的更多相关文章
- BZOJ 1208 宠物收养所
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- bzoj 1208 宠物收养所--splay
这个题也是单点维护,不管来的是人还是狗,只要num=0就插入,否则就删除. // File Name: ACM/bzoj/1208.cpp // Author: Zlbing // Created T ...
- BZOJ 1208 宠物收养所 set+二分
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题目大意: 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠 ...
- BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题
题目: 洛谷也能评 题解: 记录一下当前树维护是宠物还是人,用Splay维护插入和删除. 对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对 ...
- HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- HYSBZ 1208 宠物收养所 (Splay树)
题意:一家宠物收养所负责处理领养者与遗弃宠物业务,有人来领宠物,则领一只最理想的.若没有宠物了,领养者们就得等到宠物来,宠物一来立刻送给其中一个等待者.如果有两个理想的选择,则选择那个值较小的.收养所 ...
- [bzoj1208][HNOI2004][宠物收养所] (平衡树)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- B1208 [HNOI2004]宠物收养所 平衡树||set (滑稽)
这个题是一道splay裸题,但是我不太会写,所以用set直接水过去!!!哈哈哈哈,美滋滋. set总结: set是一个集合,然后里面没用重复的元素.里面有一些函数: begin() ,返回se ...
随机推荐
- gradle springboot 项目运行的三种方式
一.java -jar 二.eclipse中 Java Application 三.命令行 gradle bootRun
- 利用workbench对linux/Ubuntu系统中的mysql数据库进行操作
在上一篇文章中,我分享了在linux中如何安装mysql数据库,但是这只是安装了mysql的服务,并没有图形化管理界面,所以这样子操作起来并没有那么方便,那么现在我们就来实现如何利用在window中安 ...
- Axure 制作 轮播 左右按钮轮播图
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ...
- 32bit 天堂2 windows 2003 server架设教程
安装环境::[注意:本教程newauth要用不加密的版本] windows 2003 enterprise server 100用户license Microsoft sql server 2000 ...
- 云计算时代,传统企业 IT 从业者如何做好转型?
本文来源于国外社区 DZone,作者 Dennis O'Reilly 撰写过多篇关于云计算.混合云等内容的文章,本文内容围绕云计算时代,企业纷纷上云,传统 IT 从业者如何做好转型. 本文由“数梦工场 ...
- 温习DL之一:梯度的概念
1.梯度的概念 梯度是一个矢量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快. 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写 ...
- 03-matplotlib-折线图
import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates ''' 折线图,用直线段将各数 ...
- 基础业务:滚动到指定位置导航固定(CSS实现)
最近公司做的业务都是使用Vue.Element写的,涉及到的相应的基础业务像轮播.预加载.懒加载,都是使用 NPM上的工具来实现,原理和基础还是要有的,就来实现几个项目中常用到的业务. 经常见到这样的 ...
- 【探路者】Postmortem会议(“事后诸葛亮”会议)
[探路者]Postmortem会议(“事后诸葛亮”会议) 整理:米赫 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的贪吃蛇游戏主要将完成一个 ...
- Thunder-Final冲刺中间产物-2017秋-软件工程第十二次作业
Thunder-Final发布中间产物(WBS&PSP) WBS: 分解方式:按照「爱阅」阅读器的实施过程分解 使用工具:visio 2013 PSP: PSP 预期时间 Planning 计 ...