[luogu3369]普通平衡树(替罪羊树模板)
解题关键:由于需要根据平衡进行重建,所以不能进行去重,否则无法保证平衡性。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll; const double alpha=0.7;
const int N=1e5+;
int n; namespace ScapegoatTree{
struct node{
int l,r,v,sz,valid;
bool del;
}t[N<<];
int tot=,rt=;
#define ls(o) t[o].l
#define rs(o) t[o].r
#define pb push_back
int new_node(int x){++tot;t[tot].l=t[tot].r=;t[tot].v=x;t[tot].sz=t[tot].valid=;t[tot].del=;return tot;}
bool Bad(int o){
return (double)t[ls(o)].sz>alpha*t[o].sz||(double)t[rs(o)].sz>alpha*t[o].sz;
}
void Updata(int o){
t[o].sz=t[ls(o)].sz+t[rs(o)].sz+;
t[o].valid=t[ls(o)].valid+t[rs(o)].valid+!t[o].del;
}
void Dfs(int o,std::vector<int> &v){
if(!o) return;
Dfs(ls(o),v);
if(!t[o].del) v.pb(o);
Dfs(rs(o),v);
}
int Build(std::vector<int> &v,int l,int r){
if(l>r) return ;//原因是右边界不包含
int mid=(l+r)>>,o=v[mid];
ls(o)=Build(v,l,mid-);
rs(o)=Build(v,mid+,r);
Updata(o);
return o;
}
void ReBuild(int &o){
std::vector<int>v;
Dfs(o,v);
o=Build(v,,(int)v.size()-);
}
void Insert(int x,int &o){
if(!o){
o=new_node(x);
return ;
}
if(x>=t[o].v) Insert(x,rs(o));
else Insert(x,ls(o));
Updata(o);
if(Bad(o)) ReBuild(o);
return;
}
//del with rnk
void Delete(int o,int Rnk){
if(!t[o].del&&Rnk==t[ls(o)].valid+) {
t[o].del=;
--t[o].valid;
return;
}
if(Rnk<=t[ls(o)].valid+!t[o].del) Delete(ls(o),Rnk);
else Delete(rs(o),Rnk-t[ls(o)].valid-!t[o].del);
Updata(o);
}
int GetRank(int o,int x){
int ans=;
while(o){
if(t[o].v>=x) o=ls(o);
else{
ans+=t[ls(o)].valid+!t[o].del;
o=rs(o);
}
}
return ans;
}
int FindKth(int o,int x) {
while(o){
if(!t[o].del&&t[ls(o)].valid+==x) {return t[o].v;}
if(t[ls(o)].valid>=x) o=ls(o);
else {
x-=t[ls(o)].valid+!t[o].del;
o=rs(o);
}
}
}
int GetPred(int o,int x){
return FindKth(o,GetRank(o,x)-);
}
int GetSucc(int o,int x){
return FindKth(o,GetRank(o,x+));
}
}
using namespace ScapegoatTree; int main() {
scanf("%d",&n);
rt=;
while(n--) {
int op,x;
scanf("%d%d",&op,&x);
if(op==) Insert(x,rt);
if(op==) Delete(rt,GetRank(rt,x));
if(op==) printf("%d\n",GetRank(rt,x));
if(op==) printf("%d\n",FindKth(rt,x));
if(op==) printf("%d\n",GetPred(rt,x));
if(op==) printf("%d\n",GetSucc(rt,x));
}
return ;
}
[luogu3369]普通平衡树(替罪羊树模板)的更多相关文章
- [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树
Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 平衡树 替罪羊树(Scapegoat Tree)
替罪羊树(Scapegoat Tree) 入门模板题 洛谷oj P3369 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同 ...
- bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记
这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...
- bzoj 3224: Tyvj 1728 普通平衡树 替罪羊树
题目链接 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- 替罪羊树模板(BZOJ1056/1862)
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #defin ...
- [luogu3369] 普通平衡树(splay模板)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1.插入 xx 数 2.删除 xx 数(若有多个相同的数,因只删除一个) 3.查询 xx 数的排名(排名定义为比 ...
随机推荐
- Leetcode 1015. Smallest Integer Divisible by K
思路显然是暴力枚举. 但是两个问题: 1.当1的位数非常大时,模运算很费时间,会超时. 其实每次不用完全用'11111...'来%K,上一次的余数*10+1后再%K就行. 证明: 令f(n)=1111 ...
- TCP, Scoket, HTTP(转)
1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上 ...
- Socket通信简单实例(WCF调用Socket)
服务端: 控制台程序监听 /// <summary> /// Server /// </summary> class Program { static Socket serve ...
- LOJ2823 「BalticOI 2014 Day 1」三个朋友
题意 给定一个字符串 S,先将字符串 S 复制一次(变成双倍快乐),得到字符串 T,然后在 T 中插入一个字符,得到字符串 U. 给出字符串 U,重新构造出字符串 S. 所有字符串只包含大写英文字母. ...
- 阿里云ESC服务器安装tomcat后无法远程访问
问题描述:服务器上面没有部署文件,安装了tomcat,在服务器本地能通过"localhost:8080"访问到tom猫页面 但是远程访问“外网ip+:8080”就访问不了 解决方案 ...
- ubantu 安装tree命令
前提:必须安装好VMware tools 在linux系统中找不到tree这个命令时,需要安装,如ubuntu用下面的命令就可以安装tree这个命令工具,其他linux系统类似. 1 sudo apt ...
- android栈和队列
android栈和队列 栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称它们为运算受限的线性表.LinkedList数据结构是一种双向的链式结构,每一 ...
- STM32从boot跳转到app失败
现象:在每次boot执行完跳转到APP时,都会跑飞 原因:在boot中使用到了USART和TIM,boot执行完没有关闭总中断 方法:在boot执行完跳转之前关闭中断,__disable_irq() ...
- Chrome 的审查元素功能有哪些奇技淫巧
学习地址: https://www.zhihu.com/question/34682699
- lnmp一键安装包,安装多版本php,并开启redis与swoole
安装多版本的php sudo ./install.sh mphp Install ZendGuardLoader for PHP 7.1... unavailable now. Write ZendG ...