正题

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


题目大意

要求支持查询一个数字的排名,查询该排名的数字,插入数字,删除数字,求前驱后继。


解题思路

替罪羊树


codecodecode

#include<cstdio>
#include<algorithm>
#include<cctype>
#define alpha 0.8
#define N 100010
using namespace std;
inline int read(){int x(0),sign(0);char ch=getchar();while(!isdigit(ch)){if(ch=='-') sign=1;ch=getchar();}while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return sign?-x:x;
}
struct goat_Tree{int l[N],r[N],size[N],val[N],valid[N],total[N];int cur[N],memory[N];bool exist[N];int root,poi,pool,cnt;void ReMemory(){for(int i=N-10;i>=1;i--)memory[++pool]=i;}bool Isbad(int now){if((double)valid[now]*alpha<=(double)max(valid[l[now]],valid[r[now]]))return true;else return false;}void Beat(int now){if(!now) return;Beat(l[now]);if(exist[now]) cur[++poi]=now;else memory[++pool]=now;Beat(r[now]);}void New(int x){l[x]=r[x]=0;total[x]=valid[x]=1;}void Build(int ls,int rs,int &now){int mid=(ls+rs)>>1;now=cur[mid];if(ls==rs){New(now);return;}if(ls<mid) Build(ls,mid-1,l[now]);else l[now]=0;Build(mid+1,rs,r[now]);total[now]=total[l[now]]+total[r[now]]+1;valid[now]=valid[l[now]]+valid[r[now]]+1;}void ReBuild(int &now){poi=0;Beat(now);if(poi) Build(1,poi,now);else now=0;}int GetRankByVal(int k){int now=root;int ans=1;while(now){if(val[now]>=k) now=l[now];else{ans+=valid[l[now]]+exist[now];now=r[now];}}return ans;}int GetValByRank(int k){int now=root;while(now){if(exist[now]&&valid[l[now]]+1==k)return val[now];if(valid[l[now]]>=k) now=l[now];else{k-=valid[l[now]]+exist[now];now=r[now];}}}void Insert(int &now,int num){if(!now){now=memory[pool--];val[now]=num;New(now);exist[now]=1;return;}total[now]++;valid[now]++;if(val[now]>=num) Insert(l[now],num);else Insert(r[now],num);if(Isbad(now))ReBuild(now);}void Remove_z(int &now,int tar){if(exist[now]&&valid[l[now]]+1==tar){exist[now]=0;valid[now]--;return;}valid[now]--;if(valid[l[now]]+exist[now]>=tar)Remove_z(l[now],tar);else Remove_z(r[now],tar-valid[l[now]]-exist[now]);}void Remove(int tar){Remove_z(root,GetRankByVal(tar));if((double)total[root]*alpha>valid[root])ReBuild(root);}
}a;
int main()
{int opt,x,m;a.ReMemory();scanf("%d",&m);while(m--){opt=read();x=read();if(opt==1) a.Insert(a.root,x);if(opt==2) a.Remove(x);if(opt==3) printf("%d\n",a.GetRankByVal(x));if(opt==4) printf("%d\n",a.GetValByRank(x));if(opt==5) printf("%d\n",a.GetValByRank(a.GetRankByVal(x)-1));if(opt==6) printf("%d\n",a.GetValByRank(a.GetRankByVal(x+1)));}
}

P3369-[模板]普通平衡树【替罪羊树】相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Linux13-计划任务crontab
  2. 红米note3android驱动,红米note3 mtp驱动
  3. 30. SQL -- 完整性及约束(1)
  4. mapper.xml报异常The content of elhe content of element type mapper
  5. OpenCASCADE:OCCT应用框架OCAF之TObj模型辅助类和包装
  6. 二进制编译安装mysql_MariaDB通用二进制编译安装详解
  7. 2.7 Inception 网络
  8. 微信朋友圈服务器缓存,如何找到微信朋友圈照片缓存
  9. JS生成 UUID的方法
  10. zabbix监控打印机并自动更新监控项
  11. 面包机面包/蛋糕配方
  12. 报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x93 in position 1721: illegal multibyte sequen
  13. 大数据营销咨询公司AIO获数百万美元天使轮融资
  14. 软件安全期末考试试题21SZ回忆版
  15. 《设计模式之禅》书评
  16. 2021年二季度重大舆情热点盘点分析
  17. sdnu1385.Problem A: XOR(连续异或规律)
  18. 在list中插入一个数据
  19. Qt实现思维导图功能(三)
  20. 只知道LinkedIn的你,错过了多少机会!美帝十大求职网站收好

热门文章

  1. jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
  2. 广东省计算机应用(2010),2010年广东省高等教育自学考试计算机基础及应用(N)试卷(课程代码.doc...
  3. 完美国际真数苹果_如果给你推荐一款很贵,但好用的苹果手机壳,你会买吗?...
  4. linux内核分为子系统,Linux内核内存管理子系统分析【转】
  5. final类是否可以被代理_浅谈Java【代理设计模式】——看这篇文章就懂了
  6. 算法设计与分析——分治与递归——整数划分问题
  7. oracle计算最大与最小之间数,oracle 分析函数
  8. [JavaWeb-CSS]CSS基础选择器
  9. Leetcode贪心 验证回文字符串
  10. Opencv SVM demo