首页 > 其他分享 >线段树扩展

线段树扩展

时间:2024-05-22 12:20:30浏览次数:18  
标签:rt int tr 线段 扩展 mid query id

首先是动态树,以数列操作为例

点击查看代码
#include<bits/stdc++.h>
#define lson tr[id].l
#define rson tr[id].r
using namespace std;
const int N=1e6+20;
int a[N];
struct node{
	int l,r,sum;
}tr[N<<2];
int n,m;
int num;
int rt;
void update(int &id,int l,int r,int x,int ad){
	if(id==0) id=++num;//动态开点
	if(l==r){//递归到叶子
		tr[id].sum+=ad;return;
	}
	int mid=(l+r)/2;
	if(x<=mid) update(lson,l,mid,x,ad);
	else update(rson,mid+1,r,x,ad);
	tr[id].sum=tr[lson].sum+tr[rson].sum;
}
//int query(int id,int l,int r,int L,int R){
//	if(id==0) return 0;
//	if(l>=L&&r<=R) return tr[id].sum;
//	int ans=0;
//	int mid=(l+r)/2;
//	if(L<=mid) ans+=query(lson,l,mid,L,R);
//	if(R>mid) ans+=query(rson,mid+1,r,L,R);
//	return ans;
//}
//这样也可以
//int query(int id,int l,int r,int L,int R){
//	if(id==0) return 0;
//	if(l>=L&&r<=R) return tr[id].sum;
//	int mid=(l+r)/2;
//	if(R<mid) return query(lson,l,mid,L,R);
//	else if(L>mid) return query(rson,mid+1,r,L,R);
//	else return query(lson,l,mid,L,R)+query(rson,mid+1,r,L,R);
//}一样
int query(int id,int l,int r,int L,int R){
	if(l>R||r<L)return 0;
	if(id==0) return 0;
	if(l>=L&&r<=R) return tr[id].sum;
	int mid=(l+r)/2;
	 return query(lson,l,mid,L,R)+query(rson,mid+1,r,L,R);
}
int main(){
	int from,to;
	string str;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		update(rt,1,n,i,a[i]);
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>str>>from>>to;
		if(str=="ADD"){
			update(rt,1,n,from,to);
		}
		else{
			cout<<query(rt,1,n,from,to)<<endl;
		}
	}
}
4
1 4 2 3 
3
SUM 1 3 
ADD 2 50
SUM 2 3
出来的图就像这样

image

因为引用符的使用,会在左右儿子更新完后给根赋上左右儿子的编号

void update(int &id,int l,int r,int x,int ad){
	if(id==0) id=++num;
	if(l==r){
		tr[id].sum+=ad;return;
	}
	int mid=(l+r)/2;
	if(x<=mid) update(lson,l,mid,x,ad);
	else update(rson,mid+1,r,x,ad);
	tr[id].sum=tr[lson].sum+tr[rson].sum;
}

并且要引用边界,因为在普通线段树中,左右儿子的编号是固定的,树记得是左右边界,但在动态的线段树中,树记得是左右儿子(虽然左右儿子管辖的是l到mid和mid+1到r,但在比较区间时无法比较),所以要额外加上边界
此外,对于这个题来说,因为是一棵树,所以它的根节点编号恒为1

然后是权值线段树
这时候每个叶子代表的就是一个桶,记录每个数出现的次数,它们的根就是一个大桶,记录范围内出现数的次数总和

void update(int &rt,int l,int r,int x,int ad){
	if(rt==0) rt=++num;
	if(l==r){
		tr[rt].num=ad;
		tr[rt].cnt++;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) update(lson,l,mid,x,ad);
	else update(rson,mid+1,r,x,ad);
	tr[rt].cnt=tr[lson].cnt+tr[rson].cnt;
}

有一个问题:动态的线段树怎么求区间和以及区间的修改,还是根本实现不了

标签:rt,int,tr,线段,扩展,mid,query,id
From: https://www.cnblogs.com/PeppaEvenPigShiGeNiuBDePig/p/18187456

相关文章

  • form-create-designer中怎么扩展自定义组件
    form-create-designer中怎么扩展自定义组件form-create-designer是基于 @form-create/element-ui实现的表单设计器组件。可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率,节省开发者的时间。FormCreate官网:https://www.form-create.com帮助文档:https://pro.form-cr......
  • hdu4027(线段树区间操作)
    Problem-4027(hdu.edu.cn)许多邪恶的战舰在战斗前排成一排。我们的指挥官决定使用我们的秘密武器来消灭战列舰。每艘战列舰都可以标记为耐力值。对于我们秘密武器的每一次攻击,它都可能降低连续部分战列舰的续航能力,使它们的续航力达到其原始续航力值的平方根。在我们的秘密武......
  • C123【模板】扩展域并查集 P1892 [BOI2003] 团伙
    视频链接:C123【模板】扩展域并查集P1892[BOI2003]团伙_哔哩哔哩_bilibili  P1892[BOI2003]团伙-洛谷|计算机科学教育新生态(luogu.com.cn)//扩展域并查集#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,a,b,......
  • 【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统
    基本信息摘要由于深度学习(DL)可以自动从源代码中学习特征,因此已被广泛用于源代码漏洞检测。为了实现可扩展的漏洞扫描,一些先前的研究打算通过将源代码视为文本来直接处理源代码。为了实现准确的漏洞检测,其他方法考虑将程序语义提炼成图形表示,并使用它们来检测漏洞。在实践中,基于......
  • 高通在推动混合 AI 规模化 扩展方面独具优势
    高通在推动混合AI规模化扩展方面独具优势摘要正如白皮书第一部分所言,在云端和终端进行分布式处理的混合AI才是AI的未来。混合AI架构,或仅在终端侧运行AI,能够在全球范围带来成本、能耗、性能、隐私、安全和个性化优势。高通正在助力实现随时随地的智能计算。高通技术......
  • halcon xld线段中点、端点和角度的计算
    一、xld线段中点area_center_points_xld(Line4,Area,Row,Column)二、xld线段端点*xld转regiongen_region_contour_xld(LineContours,RegionLines,'filled')*提取区域轮骨skeleton(RegionLines,Skeleton)*获取轮骨端点junctions_skeleton(RegionLines,EndPoints......
  • 欧拉函数、整除分块和扩展欧几里得
    欧拉函数欧拉函数(写作\(\varphi(x)\)),表示\(i\in[1,x]且\gcd(i,x)=1\)的\(i\)的数量。乍一看好像很难求,但我们先考虑最简单的情况,即\(x\in\mathbb{P}\)(\(\mathbb{P}\)表示质数集)的情况。首先很容易看出\(\varphi(x)=x-1\),因为\(x\in\mathbb{P}\),所以\(\foralli......
  • 可持久化线段树
    经典的数据结构。权值线段树:维护一个序列,然后记下每个\(a_i\)的出现次数,相当于线段树维护桶。然后这样就可以轻而易举的求出\(1-n\)之间的第\(k\)小数了。原理类似于平衡数求\(rank.\)动态·可持久化下面考虑动态的权值线段树。\(l-r\)查询可以理解为第\(r\)个......
  • 在debian 12 中安装virtualbox扩展包
    在手册中,找到以下3种安装扩展包的方法。###在OracleVMVirtualBox中安装扩展包的过程可以增强虚拟化软件的功能,通过添加对额外特性的支持,如高级USB功能或与云服务的集成。以下是通过图形用户界面(GUI)和命令行方式安装扩展包的分步指南。###通过GUI安装扩展包1.**下载扩展包*......
  • 从油猴脚本管理器的角度审视Chrome扩展
    从油猴脚本管理器的角度审视Chrome扩展在之前一段时间,我需要借助Chrome扩展来完成一个需求,当时还在使用油猴脚本与浏览器扩展之间调研了一波,而此时恰好我又有一些做的还可以的油猴脚本TKScript(点个star吧......