【前置知识】

 线段树


【定义】

【可持久化】能够保存历史版本,方便操作区间等,减少复杂度


【主席树】

可解决的经典问题区间第k大/小

时空复杂度为O(nlogn)


【模板题】

【luogu 3834】 

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 200010;
const int MAXM = 200010;
int l[MAXN], a[MAXN],T[MAXN];
int sum[21*MAXN], ls[21 * MAXN], rs[21 * MAXN];
int n, m;
int cnt;
int build(int l, int r)
{int root=++cnt;sum[root] = 0;int mid = (l + r) >> 1;if (l < r){ls[root] = build(l, mid);rs[root] = build(mid + 1, r);}return root;
}
int update(int pre, int l, int r,int x)
{int root=++cnt;sum[root] = sum[pre] + 1;ls[root] = ls[pre];rs[root] = rs[pre];int mid = (l + r) >> 1;if (l < r){if (x <= mid)ls[root] = update(ls[pre], l, mid, x);elsers[root] = update(rs[pre], mid + 1, r,x);}return root;
}
int query(int l,int r,int x, int y, int num)
{if (l >= r)return l;int t = sum[ls[y]] - sum[ls[x]];int mid = (l + r) >> 1;if (num > t)return query(mid + 1, r, rs[x], rs[y], num - t);elsereturn query(l, mid, ls[x], ls[y], num);}
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);l[i] = a[i];}sort(l + 1, l + 1 + n);int maxn = unique(l + 1, l + 1 + n) - l - 1;T[0] = build(1, maxn);for (int i = 1; i <= n; i++){int t = lower_bound(l + 1, l + 1 + maxn,a[i]) - l;T[i] = update(T[i - 1], 1, maxn,t);}for (int i = 1; i <= m; i++){int x, y,k;scanf("%d%d%d", &x, &y, &k);printf("%d\n", l[query(1,maxn,T[x-1],T[y],k)]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/rentu/p/11279963.html

算法学习:主席树(可持久化线段树)相关推荐

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

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

  2. 主席树 - 可持久化线段树

    模板 P3834 [模板]可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc++.h> using namespace std; #de ...

  3. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  4. Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)

    题意: 解法: 如果问题可以离线,那么莫队可以直接冲过去,可惜离不得. 每个数最多只有一个>sqrt的质因子,sqrt(2e5)<90, 开90棵线段树分别维护前90个质因子的区间最大指数 ...

  5. 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree...

    题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...

  6. 可持久化线段树——主席树

    前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...

  7. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

    我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...

  8. 可持久化线段树(静态)【学习笔记】

    (静态)主席树入门 前置知识:动态开点线段树,权值线段树. 1)权值线段树:相当于将线段树当成一个桶,其中的每一个点所代表的区间相当于一段值域.维护的值为这段值域中的一些信息. 例如该图,节点2代表的 ...

  9. 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解

    P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...

  10. 【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

最新文章

  1. select标签的使用
  2. hive把字符串转换为时间_关于hive的时间转换
  3. inet_pton函数和inet_ntop函数的用法及简单实现
  4. Android平台Camera2数据如何对接RTMP推流到服务器
  5. jQuery.理解选取更新范围
  6. neo4j unwind
  7. 『初识C语言』语法入门详解
  8. SqlServer 分页批按时间排序
  9. InnoDB存储引擎介绍-(1)InnoDB存储引擎结构
  10. 最新二开版漫画小说听书三合一完整源码/整合免签接口/搭建教程/带采集接口
  11. PAT乙级刷题感想及踩坑总结
  12. matlab转换器dcdc,关于如何用 Simulink 设计 DC/DC 转换器的分析和介绍
  13. 诗字辈大全:诗仙、诗圣、诗魔、诗佛、诗神、诗鬼、诗杰、诗狂、诗骨、诗家夫子、诗豪、诗囚、诗奴...
  14. TCP 拥塞控制详解
  15. ps图片去水印-ps图片去水印教程步骤
  16. 简单BP神经网络分类手写数字识别0-9
  17. 顾客价值层级-名词解释06
  18. [中国近代史] 第五章测验
  19. MySQL运行机制-从入门到京东
  20. 阿里云-设置远程桌面连接

热门文章

  1. [Flutter] Android沉侵式标题栏顶部叠加层去除
  2. 阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新
  3. Python--day7--面向对象编程进阶
  4. 利用perf排查sys高的问题
  5. typedef函数指针使用方法
  6. php中区分大小写的超全局变量总结
  7. ***必须要掌握的计算机知识
  8. R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  9. C#字典Dictionary排序(顺序、倒序)
  10. 流利说递交招股书:上半年亏1.8亿 王翌持股27.9%