主席树 模板

主席树模板总结及题集 介绍篇:http://blog.youkuaiyun.com/metalseed/article/details/8045038  -> 理解篇(配图比较生动):http://blog.youkuaiyun.com/regina8023/article/details/41910615  -> 题目:poj2104 区间查询第k大元素,非递归写法,非递归不好进行回溯操作,递归更好写一些 #include #inc 阅读详情
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<vector>
#define inf 2147483647
#define mem0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=a;i<b;i++)
#define  rr read()
#define ll long long
#define pn putchar('\n')
#define ps putchar(' ')
#define repb(i,a,b) for(int i=a;i<=b;i++)
#define CloseIo   ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
const int N=2e5+5;
int node_cnt=0;//给结点分配的数值
int sum[N<<5],rt[N],lc[N<<5],rc[N<<5];

//sum表示该区间有几个数,rt表示每颗线段树的根结点的坐标,lc和rc分别表示左子树和右子树的位置
int a[N],b[N];//原序列和离散序列
int p;//修改点,与p相关都是要改变的那条链,需要设立新结点
void build(int &t,int left,int right) {
	t=++node_cnt;//将地址传递过来,赋值(即每个区间代表的结点值,rt,而sum初始都为0)
	if(left==right)return;
	int mid=(left+right)>>1;
	build(lc[t],left,mid);
	build(rc[t],mid+1,right);
}
int modify(int p_root,int left,int right) { //加入一个数就相当于加到第几个数的树 就改变从根到叶子(该点为第几小)路径上的sum都加一
	int root=++node_cnt;//同样的,给每一个结点赋值
	lc[root]=lc[p_root];
	rc[root]=rc[p_root];
	sum[root]=sum[p_root]+1;//直接先连接原来的左右子树 然后该区间的值加一
	//一直走到叶子节点的路径上的值都加一
	if(left==right)return root;
	int mid=(left+right)>>1;
	if(p<=mid)lc[root]=modify(lc[root],left,mid);//如果左子树涉及P,设立新结点,改变左子树的结点值
	else rc[root]=modify(rc[root],mid+1,right);//如果右子树涉及P,设立新结点,改变右子树的结点值
	return root;//记得返回该区间的结点值,该结点是父节点的左结点或右结点,确定结点值
}
int query(int u,int v,int left,int right,int k) {
	int ans,x=sum[lc[v]]-sum[lc[u]];//x表示,[left,right]区间,左子树(左区间)有几个数
	if(left==right)return left;
	int mid=(left+right)>>1;
	if(x>=k)ans=query(lc[u],lc[v],left,mid,k);//如果左边的数大于等于K个,说明第K小的数在左子树(或者左区间)
	else
		ans=query(rc[u],rc[v],mid+1,right,k-x);//反之,就在右区间的第k-x个小的数
	return ans;
}
int main() {
	int n,m;
// freopen("testdata.in","r",stdin);
// freopen("res.txt","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--) {
        node_cnt=0;
        rt[0]=0;
		scanf("%d %d",&n,&m);
		for(int i=1; i<=n; i++) {
			scanf("%d",&a[i]);
			b[i]=a[i];
		}
		sort(b+1,b+1+n);
		int q=unique(b+1,b+1+n)-b-1;//q表示不重复的数有几个,也表示主席树的最大右区间,[1,q]
		//区间[x,y]的值表示大于等于x,小于等于y的数有几个,这个用sum[k](k,结点值,代表这个区间)数组来记录
		//那么,结合下面的p和上面的q来看,这段程序其实将N个元素离散成1~q,然后再插入1~q插入到主席树中

		build(rt[0],1,q);//从0开始建 初始状态就是有0个数
		for(int i=1; i<=n; i++) {
			p=lower_bound(b+1,b+1+q,a[i])-b;
//这里p得到的是什么呢,它是a[i]这个元素在序列中是第几大(也就是在b中的下标)的数
			rt[i]=modify(rt[i-1],1,q);//每插入第i个数就生成第i个状态的树 第i棵树的访问方式由该函数返回根节点
			//每次都是在前一个状态的树上建立新树
		}
		while(m--) {
			int l,r,k;
			scanf("%d %d %d",&l,&r,&k);
			int ans=query(rt[l-1],rt[r],1,q,k);//得到的ans表示在b数组里面第ans小的数
			printf("%d\n",b[ans]);//最后输出b[ans]就是答案
		}
	}
}


 

手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码) 本文详细介绍了如何在Zynq-7100 FPGA平台上实现100Mbps OOK信号的定时同步,涵盖插值算法、Gardner定时误差检测等关键技术。通过完整的Verilog代码和优化技巧,解决了50MHz外部时钟条件下的400MHz采样率同步挑战,为无线通信系统设计提供实用解决方案。 阅读详情

相关推荐

手把手移植st7701s驱动:MT6763+安卓8.0屏幕适配保姆级教程

本文详细介绍了在MT6763平台上移植ST7701S驱动的完整流程,涵盖从LK层到Kernel层的适配方案,特别针对安卓8.0系统的特殊要求。通过MIPI转RGB屏幕适配的实战教程,帮助开发者解决常见显示问题,包括无显示、色彩异常和屏幕错位等,并提供高级调试技巧如彩条测试模式和闪屏解决方案。

weixin_29186249的博客 156

数据结构: 可持久化线段树(主席树)入门

题目链接 问题大意  给出n个整数,m次访问,每次访问有三个整数l, r, k  要求输出在n个整数中, 在区间[l, r]内的升序排列情况下的第k个的数 Input Sample 5 5 25957 6405 15770 26287 26465 2 2 1 3 4 1 4 5 1 1 2 2 4 4 1 Output Sample 6405 15770 26287 25957...

weixin_44090305的博客 1451

Jetson-nano 编译实时内核并烧录

前言 之前一篇文章介绍了正常的烧录过程,使用的是默认内核,实际工作中需要对内核打补丁升级为实时内核,并对其重编译。 一、准备内容 官网大法好 官方内核下载链接 官方交叉编译器下载链接 官方文档 ubuntu主机一台 根据官网选择下载对应的文件, 1、L4TDriver Package (BSP) source jetson内核文件。 2、官方交叉编译器 因为我们不是在jetson上直接编译,而jetson是arm平台,所以要进行交叉编译。 二、使用步骤 1.解压 内核 tar -xjf public_s

ldl371122的博客 3286

poj2104 主席树(还是不太会)

这篇博客写的挺好的 推荐去看 https://blog.youkuaiyun.com/woshinannan741/article/details/53012682 Input The first line of the input file contains n — the size of the array, and m — the number of questions to answer (1 &lt...

h_666666的博客 280

如何在 Windows 11 上安装 ChatGPT:CMD + 图形界面两种方式

我没说在 Windows 11 上装 ChatGPT 应用有多难,但你要是知道有哪几种官方途径可用,事情就会顺一点,尤其是对新手。对大多数用户来说,商店应用就是正确的选择。如果你在受管理的设备上,或者想避开商店,那么通过 Edge 或 Chrome 装 PWA 是完全站得住脚的替代方案。不管你选哪条路,真正的收获都是把 ChatGPT 从浏览器标签页里挪出来,放进一个它真正像个工具的地方。把它固定到任务栏、配好 Alt + 空格,你就会纳闷以前没它是怎么干活的。

山岚的运维笔记 289

Windows MCP 安装教程:让 AI 代理与 Windows 系统无缝交互

通过以上步骤,你已经成功安装和配置了 Windows MCP 服务。现在你的 Cursor 编辑器可以通过 MCP 协议与 Windows 系统进行深度交互,AI 代理能够:启动和控制应用程序执行系统命令自动化 UI 操作获取系统状态信息这为 AI 辅助开发和工作流程自动化提供了强大的基础。如果你在使用过程中遇到任何问题,欢迎在评论区讨论或查看项目的官方文档。

chenchihwen的专栏 3349

主席树(可持久化线段树)学习笔记

因为是可持久化线段树,要能够保存历史版本,所以要借助线段树历史版本之间 各个节点的关系来优化内存.如果线段树每次只修改某一个叶子节点,那么整个 线段树改变的节点也就是这个叶子节点到根节点的路径上的点.所以当需要保存 版本i的线段树的时候可,如果某一个孩子没有改变,就可以让这个孩子指向前一个 版本的线段树的这个位置. 静态区间第k小: HDU  2665:点击打开链接 用到了权

morejarphone~ 430

如何实现SOLIDWORKS阵列的“智能变更”?

有时,我们在设计一个零件时,零件上有一排阵列孔,同时零件有不同的长度,我们又希望可以做到零件长度改变时,这排孔可以按长度等距增减孔阵列的个数;或是零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那具体要怎么做呢?接下来,我们一起来看看怎么用SOLIDWORKS中简单的操作来实现这两种智能的变更: 零件长度加长或缩短时,这排孔要按长度等距增减孔阵列的个数。 零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那接下来,我们一起来看看怎么用简单的操作来实现这两种智能的

SOLIDWORKS艾金米 2076

主席树模板

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,m,sum[20*N],ls[20*N],rs[20*N],rt[N],a[N],b[N],sz,k,cnt; void up(int pre,int &o,int l,int r,int pos) { o=++cnt; ls[o]...

ccsu_deer 604

codemirror6 制作markdown编辑器(源码模式)

总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。

qq_43203949的博客 1783

MTK平台Wi-Fi学习--wifi channel 通过国家码进行功率限制和wifi eFEM 基本配置和wifi Tx SEM问题

本文介绍了WiFi功率限制配置和eFEM硬件设置方法。在功率限制方面,通过国家码可针对不同信道设置功率上限,需在rlm_txpwr_init.h文件中配置信道和功率值(单位0.5dBm),WiFi6的HE_TB模式还可分RU设置。eFEM硬件配置需参考平台设计,注意VDET接口处理,首次使用建议提交HW/SW案例审核。软件配置需获取专用FEM包,包含NVRAM、GPIO等文件,按指导合并后版本才会切换为eFEM版本。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 483

主席树算法模板

主席树代码模板 本篇博客仅提供代码模板,具体的算法思想,等本蒟蒻深度理解主席树之后补上。 题目描述 给定 n 个整数构成的序列 a,将对于指定的闭区间 [l, r] 查询其区间内的第 k 小值。 代码模板 #include<iostream> #include<time.h> #include<cstdio> #include<cmath> #include<queue> #include<stack> #include<vect

qq_45863423的博客 202

C/C++炫酷烟花①(完整代码)

C/C++实现炫酷烟花动画的完整代码。

AIGC 2万+

主席树模板题

主席树模板题 Keen On Everything But Triangle 题目描述 N sticks are arranged in a row, and their lengths are a1,a2,…,aN.There are Q querys....

VUno)UKGzseI 182

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

大半年没用过主席树了,手敲回顾下,20min手敲1A主席树模板。。 我感觉我线段树这一块拿捏的死死的!! 很easy #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 2e5+7; int a[M],li[M],cnt=0; int rt[M*20],ls[M*20],rs[M*20],tr[M*20]; void up(int pre,int &o,int l,in

bjfu170203101的博客 247

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

模板:主席树

主席树模板 code: #include <bits/stdc++.h> using namespace std; typedef long long ll; bool Finish_read; template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar...

dieyi9889的博客 92

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

主席树【模板】

显然,如果我们将每次修改操作后的线段树存下来会消耗大量空间,但是,如果我们不存储修改操作后的整棵树,而是只增加新修改的点。对于每一次修改,我们只需要建立修改点和与其相关点的新节点就可以了,其他的点直接连在之前版本的树上就可以了。首先要明白主席树做的什么:对一棵线段树的节点进行修改,然后查询第。是在每次修改前先将上一个版本的节点复制一次。由此观察主席树的存储和线段树有明显的差异。的大佬创建的所以又叫做主席树。次操作后的线段树中的某个节点。主席树因为创建者名字缩写为。

qq_57730943的博客 441
上一篇: CCPC 2019秦皇岛 Invoker I题 hdu6739
下一篇: 平衡树 treap 模板
explodee
博客等级 码龄9年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值