算法学习:主席树(可持久化线段树)
【前置知识】
线段树
【定义】
【可持久化】能够保存历史版本,方便操作区间等,减少复杂度
【主席树】
可解决的经典问题区间第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
算法学习:主席树(可持久化线段树)相关推荐
- 学习笔记:可持久化线段树(主席树):静态 + 动态
学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树.线段树分享可以看:@秦淮岸.@ZYzzz.@妄想の岚がそこに 树状数组.\(BIT\)分享可以看:@T-Sherlock.Chi ...
- 主席树 - 可持久化线段树
模板 P3834 [模板]可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc++.h> using namespace std; #de ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)
题意: 解法: 如果问题可以离线,那么莫队可以直接冲过去,可惜离不得. 每个数最多只有一个>sqrt的质因子,sqrt(2e5)<90, 开90棵线段树分别维护前90个质因子的区间最大指数 ...
- 主席树 || 可持久化线段树 || 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) ...
- 可持久化线段树——主席树
前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...
- 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)
我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...
- 可持久化线段树(静态)【学习笔记】
(静态)主席树入门 前置知识:动态开点线段树,权值线段树. 1)权值线段树:相当于将线段树当成一个桶,其中的每一个点所代表的区间相当于一段值域.维护的值为这段值域中的一些信息. 例如该图,节点2代表的 ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
- 【模板】可持久化线段树 1(主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
最新文章
- select标签的使用
- hive把字符串转换为时间_关于hive的时间转换
- inet_pton函数和inet_ntop函数的用法及简单实现
- Android平台Camera2数据如何对接RTMP推流到服务器
- jQuery.理解选取更新范围
- neo4j unwind
- 『初识C语言』语法入门详解
- SqlServer 分页批按时间排序
- InnoDB存储引擎介绍-(1)InnoDB存储引擎结构
- 最新二开版漫画小说听书三合一完整源码/整合免签接口/搭建教程/带采集接口
- PAT乙级刷题感想及踩坑总结
- matlab转换器dcdc,关于如何用 Simulink 设计 DC/DC 转换器的分析和介绍
- 诗字辈大全:诗仙、诗圣、诗魔、诗佛、诗神、诗鬼、诗杰、诗狂、诗骨、诗家夫子、诗豪、诗囚、诗奴...
- TCP 拥塞控制详解
- ps图片去水印-ps图片去水印教程步骤
- 简单BP神经网络分类手写数字识别0-9
- 顾客价值层级-名词解释06
- [中国近代史] 第五章测验
- MySQL运行机制-从入门到京东
- 阿里云-设置远程桌面连接
热门文章
- [Flutter] Android沉侵式标题栏顶部叠加层去除
- 阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新
- Python--day7--面向对象编程进阶
- 利用perf排查sys高的问题
- typedef函数指针使用方法
- php中区分大小写的超全局变量总结
- ***必须要掌握的计算机知识
- R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
- C#字典Dictionary排序(顺序、倒序)
- 流利说递交招股书:上半年亏1.8亿 王翌持股27.9%