解题关键:由于需要根据平衡进行重建,所以不能进行去重,否则无法保证平衡性。

#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+500;
int n;namespace ScapegoatTree{struct node{int l,r,v,sz,valid;bool del;}t[N<<2];int tot=0,rt=0;
#define ls(o) t[o].l
#define rs(o) t[o].r
#define pb push_backint new_node(int x){++tot;t[tot].l=t[tot].r=0;t[tot].v=x;t[tot].sz=t[tot].valid=1;t[tot].del=0;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+1;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 0;//原因是右边界不包含int mid=(l+r)>>1,o=v[mid];ls(o)=Build(v,l,mid-1);rs(o)=Build(v,mid+1,r);Updata(o);return o;}void ReBuild(int &o){std::vector<int>v;Dfs(o,v);o=Build(v,0,(int)v.size()-1);}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 rnkvoid Delete(int o,int Rnk){if(!t[o].del&&Rnk==t[ls(o)].valid+1) {t[o].del=1;--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=1;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+1==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)-1);}int GetSucc(int o,int x){return FindKth(o,GetRank(o,x+1));}
}
using namespace ScapegoatTree;int main() {scanf("%d",&n);rt=0;while(n--) {int op,x;scanf("%d%d",&op,&x);if(op==1) Insert(x,rt);if(op==2) Delete(rt,GetRank(rt,x));if(op==3) printf("%d\n",GetRank(rt,x));if(op==4) printf("%d\n",FindKth(rt,x));if(op==5) printf("%d\n",GetPred(rt,x));if(op==6) printf("%d\n",GetSucc(rt,x));}return 0;
}

转载于:https://www.cnblogs.com/elpsycongroo/p/10375214.html

[luogu3369]普通平衡树(替罪羊树模板)相关推荐

  1. 替罪羊树+3369 【模板】普通平衡树

    传送门 一听是平衡树 就jio的很难很难 然而大佬说很简单 (听的时候确实jio的没有想象中的那么难<大佬讲的好orz) 然而 写代码的时候就完全不是了 足足花了我两个晚上啊 终于整的差不多明白 ...

  2. 【Luogu】P3369 【模板】普通平衡树(树状数组)

    P3369 [模板]普通平衡树(树状数组) 一.树状数组 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构. ...

  3. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  4. P3369-[模板]普通平衡树【替罪羊树】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=SSL_WYC_zombieeeeee&pid=P3369&status=& ...

  5. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树

    冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...

  6. 【替罪羊树及其应用】替罪羊树总结

    update:退役后对这篇文章进行了一些更新,主要增加了一个后缀平衡树的版块.很遗憾的,csp的350给我的OI生涯画上了句号.记得联赛前大概写了10遍平衡树模板,遗憾没有用上.不过代码经过联赛前反复 ...

  7. BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...

  8. 【WC2014】紫荆花之恋【替罪羊思想】【动态点分树】【替罪羊树】

    传送门 题意:有一棵开始时没有结点的树,nnn次询问,每次新加一点并给定父结点.到父亲的距离.参数rir_iri​,并询问满足dist(u,v)≤ru+rvdist(u,v)\leq r_u+r_vd ...

  9. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

  10. NKOJ 2703 (WC 2014)紫荆花之恋 (点分治+平衡树+替罪羊)

    P2703[WC2014]紫荆花之恋(强数据版) 问题描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花废物的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了 ...

最新文章

  1. ASP.NET Session 使用报告(转贴)
  2. 上海交通大学乐经良高数手写笔记-多元微积分
  3. c++计算机等级考试笔记(1)
  4. 设计模式-策略模式和工厂模式结合使用
  5. 关于Hadoop的一些网络资料
  6. 关于ViewPager使用出现的图片覆盖错误问题
  7. jenkins中使用rsync, scp命令
  8. linux删除csv换行符,从CSV保存行删除换行符(Remove linefeed from csv preserving r
  9. 给RabbitMQ发送消息时,设置请求头Header。
  10. .Net之Layui多图片上传
  11. Excel对于筛选后单元格进行“复制”与“粘贴”
  12. (十五)TcpClient
  13. TiDB的设计哲学——Make It Work! Make It Right! Make It Fast!
  14. 网络编辑如何经营网络社区?
  15. 畅享7 plus android8,华为畅享7plus和荣耀8哪个好?荣耀8与畅享7plus详细区别对比评测...
  16. 刚刚搬进公寓,应该每个月交100块网费好还是买个随身WiFi?
  17. jsp简易的图书管理系统
  18. 关于图片onload事件兼容性处理, 谷歌浏览器版本 56.0.2896.3 (64-bit) 微信客户端浏览器 canvas篇
  19. CF 678F Lena and Queries
  20. 2017美团点评校招前端面试题

热门文章

  1. PRD之道:4个撰写PRD的关键思路
  2. mysql number decimal_Oracle中的decimal与Number区别
  3. 集合set中的基数cardinality是什么意思
  4. c性能大容量cket_水合低共熔电解质有助于改善水性锌电池的性能
  5. mysql+alter+int_MySQL Alter命令
  6. 计算机网络在物流领域的应用研究,计算机网络技术在物流经济领域中的应用特点及其作用.doc...
  7. 怎样呵护友谊_我不善于经营友情,有好的开始却没有好的友谊,怎样建设友情呢?...
  8. datatable自定义表单或者导出excel按钮,搜索
  9. vue思维导图(这是我在b站老师下载资源里的讲课流程,用来复习和整体把握还不错)
  10. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile