P3834 【模板】可持久化线段树 1(主席树)
传送门
如标题,主席树模板
稍微介绍一下主席树..
主席树是很多个线段树的结合体
利用了单点修改不会更新太多节点的结论(反正这一题是这样..),后一个线段树借用前面线段树的节点,而对于更新的节点才开一个新的节点存储数据,大大的节省了时间和空间
(除第一颗树外其他树的构建只要log(n)的时间和空间)
具体还是看代码吧
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int N=200010; int n,m,a[N],b[N],cnt; int rt[N<<5],L[N<<5],R[N<<5],sz[N<<5]; //rt为根节点编号 //L[i]为节点i的左子树编号,R[i]是节点i的右子树编号 //sz[i]是以节点i为根的子树的大小 inline int build(int l,int r) //建立第一颗线段树,不解释 {int root=++cnt;if(l==r) return root;int mid=l+r>>1;L[root]=build(l,mid);R[root]=build(mid+1,r); } inline int add(int l,int r,int k,int pre)//添加新节点 {int root=++cnt; sz[root]=sz[pre]+1;//因为每次添加的线段树都比前一个线段树多一个节点//所以sz也要比上一个线段树多1if(l==r) return root; //如果到边界就返回int mid=l+r>>1;L[root]=L[pre]; R[root]=R[pre]; //借用前面线段树的节点if(k<=mid) L[root]=add(l,mid,k,L[pre]);//如果更新的值的位置在左子树就添加新节点到左边,并覆盖L[root]else R[root]=add(mid+1,r,k,R[pre]);//反之就添加新节点到右边,同样要覆盖return root;//返回新节点的编号 } inline int query(int l,int r,int hea,int las,int k)//查询区间第k名 {if(l==r) return l; //如果到边界就返回节点编号//找排名的基本操作int mid=l+r>>1,x=sz[L[las]]-sz[L[hea]]; if(x>=k) return query(l,mid,L[hea],L[las],k);return query(mid+1,r,R[hea],R[las],k-x); } int main() {cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+n+1);//排序int len=unique(b+1,b+n+1)-b-1;//去重rt[0]=build(1,len);//建树for(int i=1;i<=n;i++){int t=lower_bound(b+1,b+len+1,a[i])-b;//在b中找<=a[i]的最大位置rt[i]=add(1,len,t,rt[i-1]);//加点 }int x,y,z;while(m--){scanf("%d%d%d",&x,&y,&z);printf("%d\n",b[query(1,len,rt[x-1],rt[y],z)]);}return 0; }
转载于:https://www.cnblogs.com/LLTYYC/p/9536454.html
P3834 【模板】可持久化线段树 1(主席树)相关推荐
- 学习笔记:可持久化线段树(主席树):静态 + 动态
学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树.线段树分享可以看:@秦淮岸.@ZYzzz.@妄想の岚がそこに 树状数组.\(BIT\)分享可以看:@T-Sherlock.Chi ...
- 【洛谷】P3919 【模板】可持久化线段树(主席树)
题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; const int N=1000010; ...
- 可持久化线段树【主席树】可持久化并查集【主席树+并查集】
笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...
- 可持久化线段树(主席树)【舰娘系列】【自编题】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...
- 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62485671 向大(hei)佬(e)势力学(di ...
- SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)
题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...
- 【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
题干: 链接:https://ac.nowcoder.com/acm/contest/157/C 来源:牛客网 题目描述 PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性. HtBest有 ...
- BZOj #4771. 七彩树(主席树+dfn序+lca)
BZOj #4771. 七彩树 description solution code description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色, ...
- 2019.03.25 bzoj4539: [Hnoi2016]树(主席树+倍增)
传送门 题意:给一棵大树,令一棵模板树与这棵树相同,然后进行mmm次操作,每次选择模板树中的一个节点aaa和大树中一个节点bbb,把aaa这棵子树接在bbb上面,节点编号顺序跟aaa中的编号顺序相同. ...
- 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...
最新文章
- 收藏|最优论文+代码查找神器,覆盖AI全领域(966个ML任务、8500+论文)
- .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
- 第二百九十、一、二天 how can I 坚持
- oracle 赋值表数据类型,PL/SQL数据类型及操作符
- [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
- 项望烽:iOS App开发的那些事儿
- 菜单权限管理怎么实现_Java第58讲——极简的权限管理实现方案
- PageHelper工作原理
- 二叉树的前序、中序、后续、层序遍历(包含递归与非递归)
- C语言printf 和 scanf 用法
- 需要用sq语句 修改大批量用户的密码_网站文章seo优化及修改已收录文章建议
- redis远程链接(NOAUTH Authentication required)
- 他山之石 | 腾讯 多模态内容理解技术及应用
- 计算机图形学多边形填充代码_计算机图形学 Computer Graphics (第一周笔记及课件翻译)...
- PowerBuilder 开发的游戏(建房子)
- 第2章 大数据处理架构Hadoop
- 微信小程序UI库组件库合集
- 关于pr(Premiere)的记录
- 企业微信第三方应用开发
- 中国计算机协会a类,中国计算机学会推荐A类国际学术会议列表.DOC