传送门

如标题,主席树模板

稍微介绍一下主席树..

主席树是很多个线段树的结合体

利用了单点修改不会更新太多节点的结论(反正这一题是这样..),后一个线段树借用前面线段树的节点,而对于更新的节点才开一个新的节点存储数据,大大的节省了时间和空间

(除第一颗树外其他树的构建只要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(主席树)相关推荐

  1. 学习笔记:可持久化线段树(主席树):静态 + 动态

    学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树.线段树分享可以看:@秦淮岸.@ZYzzz.@妄想の岚がそこに 树状数组.\(BIT\)分享可以看:@T-Sherlock.Chi ...

  2. 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; const int N=1000010; ...

  3. 可持久化线段树【主席树】可持久化并查集【主席树+并查集】

    笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...

  4. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

  5. 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62485671 向大(hei)佬(e)势力学(di ...

  6. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...

  7. 【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/C 来源:牛客网 题目描述 PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性. HtBest有 ...

  8. BZOj #4771. 七彩树(主席树+dfn序+lca)

    BZOj #4771. 七彩树 description solution code description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色, ...

  9. 2019.03.25 bzoj4539: [Hnoi2016]树(主席树+倍增)

    传送门 题意:给一棵大树,令一棵模板树与这棵树相同,然后进行mmm次操作,每次选择模板树中的一个节点aaa和大树中一个节点bbb,把aaa这棵子树接在bbb上面,节点编号顺序跟aaa中的编号顺序相同. ...

  10. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)

    传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...

最新文章

  1. 收藏|最优论文+代码查找神器,覆盖AI全领域(966个ML任务、8500+论文)
  2. .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
  3. 第二百九十、一、二天 how can I 坚持
  4. oracle 赋值表数据类型,PL/SQL数据类型及操作符
  5. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
  6. 项望烽:iOS App开发的那些事儿
  7. 菜单权限管理怎么实现_Java第58讲——极简的权限管理实现方案
  8. PageHelper工作原理
  9. 二叉树的前序、中序、后续、层序遍历(包含递归与非递归)
  10. C语言printf 和 scanf 用法
  11. 需要用sq语句 修改大批量用户的密码_网站文章seo优化及修改已收录文章建议
  12. redis远程链接(NOAUTH Authentication required)
  13. 他山之石 | 腾讯 多模态内容理解技术及应用
  14. 计算机图形学多边形填充代码_计算机图形学 Computer Graphics (第一周笔记及课件翻译)...
  15. PowerBuilder 开发的游戏(建房子)
  16. 第2章 大数据处理架构Hadoop
  17. 微信小程序UI库组件库合集
  18. 关于pr(Premiere)的记录
  19. 企业微信第三方应用开发
  20. 中国计算机协会a类,中国计算机学会推荐A类国际学术会议列表.DOC

热门文章

  1. idea安装golang插件(仅针对2017年之前的idea版本)
  2. Scala抽象属性的继承
  3. Python3身份运算符(比较对象是否相同)
  4. Linux shell条件判断
  5. Java Stack栈类详解
  6. WebService实例-CRM系统提供WebService实现用户注册功能
  7. synchronized修饰静态方法与实例方法
  8. 同一个硬盘装多个linux系统,在一个硬盘上安装两个Linux操作系统方法
  9. prometheus接入mysqld_exporter
  10. Ubuntu下安装谷歌浏览器(Google chrome)报错