[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 数的排名(排名定义为比 ...
随机推荐
- Mongodb 的劣势
MongoDB中的数据存放具有相当的随意性,不具有MySQL在开始就定义好了.对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦. 1. 事务关系支持薄弱.这也是所有 ...
- for-in 的坑
for-in 循环的下标为字符串,不是数字 var ar=[13,2,13,14]; function isSort(ar){ for(var i in ar){ console.log(i+':'+ ...
- 第一章 Linux系统入门
设定目标,寻求方法,勤奋努力,坚持不懈. ------你们知道了,而我们做到了.------ 世界上第一台计算机:ENIAC(埃尼亚克).1946-2 宾夕法尼亚大学. 约翰·冯·诺依曼体系 电脑的组 ...
- 使用Hydra通过ssh破解密码
Hydra是非常高效的网络登录破解工具,它可以对多种服务程序执行暴力破解(SSH.VNC等等). 防止这种攻击其实很容易,方法很多.以SSH为例: Ubuntu:使用Port Knocking隐藏SS ...
- Block Towers (思维实现)
个人心得:这题没怎么看,题意难懂.后面比完再看的时候发现很好做但是怎么卡时间是个问题. 题意:就是有m个可以用2层积木的,n个可以用三层积木的,但是他们不允许重复所以可以无限添加. 比如 3 2 一开 ...
- 【转】IUSR和IIS_IUSRS
转自:http://blog.chinaunix.net/uid-20344928-id-3306130.html 概述 在早期的IIS版本中,随着IIS的安装,系统会创建一个IUSR_Mac ...
- lvds配置
基于Altera FPGA的LVDS配置应用一例 在特权同学发表博文<Cyclone III的LVDS接口注意事项>后,不少网友发邮件询问LVDS具体应用的一些问题.这些网友,归根到底,估 ...
- oracle系统表的查询
oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查 ...
- C# 实现程序只启动一次(实现程序自重启)
程序运行过程中,不能有多个实例运行,并且需要程序自己可以重启(重新运行),所以代码如果下代码: static void Main() { bool createNew; using (System.T ...
- windows下安装storm1.1.0并启动
64位windows安装storm前需要先搞定zookeeper和python,所以下面我们3步走: 一.zookeeper 1.上https://zookeeper.apache.org/点击下方d ...