模板

P3834 【模板】可持久化线段树 2(主席树) 区间求第 \(k\) 大

模板代码
#include<bits/stdc++.h>
using namespace std;
#define Maxn 200005
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
/*
len: 数组长度
cnt: 数据范围
*/
int len,n,m,used;
int root[Maxn],a[Maxn],True_val[Maxn];
struct Li
{int val,num;
}LI[Maxn];
bool cmp(Li x,Li y) { return x.val<y.val; }
struct Tree
{int ls,rs,sum;
}tree[Maxn<<5];
void pushup(int p)
{tree[p].sum=tree[tree[p].ls].sum+tree[tree[p].rs].sum;
}
void build(int p,int nl,int nr)
{if(nl==nr) return;int mid=(nl+nr)>>1;if(mid>=nl) tree[p].ls=++used,build(tree[p].ls,nl,mid);if(mid<nr) tree[p].rs=++used,build(tree[p].rs,mid+1,nr);
}
void add(int p1,int p2,int nl,int nr,int pos,int k)
{if(nl==nr) { tree[p2].sum=tree[p1].sum+k; return; }int mid=(nl+nr)>>1;tree[p2]=tree[p1];if(pos<=mid) tree[p2].ls=++used,add(tree[p1].ls,tree[p2].ls,nl,mid,pos,k);else tree[p2].rs=++used,add(tree[p1].rs,tree[p2].rs,mid+1,nr,pos,k);pushup(p2);
}
int query(int p1,int p2,int nl,int nr,int rank)
{if(nl==nr) return nl;int sumls=tree[tree[p2].ls].sum-tree[tree[p1].ls].sum,mid=(nl+nr)>>1;if(rank<=sumls) return query(tree[p1].ls,tree[p2].ls,nl,mid,rank);else return query(tree[p1].rs,tree[p2].rs,mid+1,nr,rank-sumls);
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);len=rd(),m=rd();for(int i=1;i<=len;i++) LI[i].val=rd(),LI[i].num=i;sort(LI+1,LI+len+1,cmp),LI[0].val=-1;for(int i=1;i<=len;i++){if(LI[i].val!=LI[i-1].val) n++;a[LI[i].num]=n;True_val[n]=LI[i].val;}for(int i=0;i<=len;i++) root[i]=++used;build(root[0],1,n);for(int i=1;i<=len;i++) add(root[i-1],root[i],1,n,a[i],1);for(int i=1,l,r,k;i<=m;i++){l=rd(),r=rd(),k=rd();printf("%d\n",True_val[query(root[l-1],root[r],1,n,k)]);}//fclose(stdin);//fclose(stdout);return 0;
}

例题

P3899 [湖南集训]更为厉害

主要实现内容:给定一棵树,每次询问求出 \(u\) 的子树内,与 \(u\) 距离不超过 \(k\) 的所有节点的点权之和。

可以考虑以 \(dfn\) 序列作为 \(root[]\) ,每一个节点开一棵主席树。

修改时以每个点的深度为下标,附上点权。

这样就可以快速查询一颗子树(一段区间),并查询制指定深度的点权之和。

主席树 - 可持久化线段树相关推荐

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

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

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

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

  3. 主席树 || 可持久化线段树 || 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) ...

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

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

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

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

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

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

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

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

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

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3834 题意 给定一个长度为n的序列,有m个询问,求一个区间内的第k ...

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

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

最新文章

  1. css3 text-shadow 为网页字体添加阴影
  2. 使用Java代码在应用层获取Android系统属性
  3. RFID会议签到系统总结(二十一)――服务端的通讯
  4. 计算机文化基础论述题,计算机文化基础复习题六
  5. JS学习笔记-1--基本知识和注意事项
  6. DataV数据可视化功能特性
  7. 特斯拉加州工厂无视禁令强行复工,马斯克:要抓就只抓我
  8. python自动化办公 51cto_利用python实现批量自动化运维脚本案例
  9. Hadoop 系列 HDFS:分布式文件系统(HDFS文件读写)
  10. 大数据该如何运行与分析
  11. CANoe下载地址以及CAN Demo 16的下载与激活,并附录所有CANoe软件版本
  12. 麒麟3.2安装微软雅黑字体
  13. kali自定义分辨率
  14. python怎样批量修改文件大小_使用python对文件夹下的照片进行批量修改尺寸
  15. pandas缺省值处理
  16. 【转】中国人唯一不认可的成功——就是家庭的和睦,人生的平淡
  17. Vscode 打开终端窗口
  18. AVT工业相机Windows、Opencv开发——驱动相机(超详细)
  19. wap精武堂源码php_Showgirl武装秀【精武堂】大奖等你拿
  20. 腾讯财付通漏洞遭黑客利用 威胁QQ彩钻等付费用户

热门文章

  1. 7-1 输出全排列 (20 分)(全排列+递归+图解)Come Baby
  2. [EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。
  3. 算法导论10-2.4题
  4. 在O(1)的时间内计算n个整数落在区间[a,b]的个数(预处理时间为O(n+k))
  5. 圆桌会议 HDU - 1214(规律+模拟队列)
  6. 数据结构----单源最短路径Dijkstra
  7. 从基于直方图的Graph-Cut到Grab-Cut
  8. 2021CCPC华为云挑战赛:HDU 7091 重叠的子串(SAM + 线段树合并)
  9. P2260 [清华集训2012]模积和,P2834 能力测验(二维除法分块)
  10. P5357 【模板】AC自动机(二次加强版) fail树