首页 > 其他分享 >线段树模板

线段树模板

时间:2024-03-14 21:45:49浏览次数:21  
标签:int 线段 mid tag void 模板

线段树模板

沉淀了很久,总算是掌握了线段树的经典模板了。但是还是需要深刻练习才能反复加深印象呢

//线段树模板
#include<bits/stdc++.h>
using namespace std;
#define int long long


const int N=1e5+10;
int ans[N*4];
int t1[N*4],t2[N*4];
int a[N];//存放输入数据
int n,m;
int tag[N*4];



//查找左右儿子
inline int leftson(int x){
	return x<<1;

}
inline int rightson(int x){
	return x<<1|1;

}

//维护区间关系(前缀和,区间最大值,最小值)
void PushSum(int x){
	ans[x]=ans[leftson(x)]+ans[rightson(x)];
}


void PushMax(int x){
	t1[x]=max(t1[leftson(x)],t1[rightson(x)]);
}

void PushMin(int x){
	t2[x]=min(t2[leftson(x)],t2[rightson(x)]);
}

//建树
void build(int x,int l,int r){
	if(l==r){
		ans[x]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(leftson(x),l,mid);
	build(rightson(x),mid+1,r);

	PushSum(x);
	// PushMax(x);
	// PushMin(x);
	

}


//区间修改

inline void f(int x,int l,int r,int k){
	tag[x]=tag[x]+k;
	ans[x]=ans[x]+k*(r-l+1);
	//这里需要区分是整体加k,还是当前区间所有都加k
}

inline void PushDown(int x,int l,int r){
	int mid=(l+r)>>1;
	f(leftson(x),l,mid,tag[x]);
	f(rightson(x),mid+1,r,tag[x]);
	tag[x]=0;

}

inline void  update(int nl,int nr,int l,int r,int x,int k){
	//nl,nr是要修改的区间
	//l,r是当前节点所存储的区间以及节点的编号
	if(nl<=l&&r<=nr){
		ans[x]+=k*(r-l+1);
		tag[x]+=k;
		return ;
	}
	PushDown(x,l,r);
	int mid=(l+r)>>1;
	if(nl<=mid) update(nl,nr,l,mid,leftson(x),k);
	if(nr>mid) update(nl,nr,mid+1,r,rightson(x),k);
	PushSum(x);

}

//区间查询

int query(int _x,int _y,int l,int r,int x){
	int res=0;
	if(_x<=l&&r<=_y){
		return ans[x];
	}
	int mid=(l+r)>>1;
	PushDown(x,l,r);
	if(_x<=mid){
		res+=query(_x,_y,l,mid,leftson(x));

	}
	if(_y>mid){
		res+=query(_x,_y,mid+1,r,rightson(x));

	}
	return res;
	
}

void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];

	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;	
			update(x,y,1,n,1,k);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(x,y,1,n,1)<<endl;
			
		}
	}
}

signed main(){
	int t=1;
	while(t--){
		solve();
	}
	return 0;

}

标签:int,线段,mid,tag,void,模板
From: https://www.cnblogs.com/du463/p/18074059

相关文章

  • C++函数模板的重载
    C++模板当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。我们定义了Swap(......
  • 滑动窗口模板
    /*滑动窗口算法框架*/voidslidingWindow(Strings){//用合适的数据结构记录窗口中的数据HashMap<Character,Integer>window=newHashMap<>();intleft=0,right=0;while(right<s.length()){//c是将移入窗口的字符char......
  • 模板匹配——determine_shape_model_params
    determine_shape_model_params—Determinetheparametersofashapemodel.模版匹配参数确定 determine_shape_model_paramsdeterminescertainparametersofashapemodelautomaticallyfromthemodelimageTemplate.Theparameterstobedeterminedcanbesp......
  • 模板匹配——create_shape_model
    Theoperatorcreate_shape_modelpreparesatemplate,whichispassedintheimageTemplate,asashapemodelusedformatching.TheROIofthemodelispassedasthedomainofTemplate.运算符create_shape_model准备一个模板,该模板在图像模板中传递,作为用于匹配的......
  • cmake 模板
    目录一、cmake模板二、参数设置三、命令解释3.1find命令3.2file执行与文件和目录相关的操作3.3自定义命令3.4配置文件四、自动化测试五、安装5.1Linux的rpath机制5.2CMAKE_INSTALL_RPATH的使用案例5.3CMAKE_BUILD_RPATH的使用案例六、闭源包引用七、vcpkg包管理6.1安装6.......
  • 解决Thymeleaf模板修改不实时更新问题的有效方法
    修改yml文件,thymeleaf中的prefix:file:D:/resources是重点,如果只修改了cache:false也会不生效spring:thymeleaf:#不启用模版缓存cache:false#修改模板存放位置,使用file方式修改模板文件实时生效不需要重新编译prefix:file:D:/resources#如......
  • 【前端素材】推荐优质在线绿色有机果蔬商城网页Fulo平台模板(附源码)
    一、需求分析绿色新鲜有机果蔬商城是指一个专门销售绿色、有机、新鲜水果和蔬菜的在线平台,旨在为用户提供优质的、健康的食品购物体验。1、功能分析:绿色新鲜有机果蔬商城是指一个专门销售绿色、有机、新鲜水果和蔬菜的在线平台,旨在为用户提供优质的、健康的食品购物体验。下......
  • 模板匹配——金字塔图像计算gen_gauss_pyramid
           **计算高斯金字塔图像*dev_open_window(0,0,800,600,'black',WindowHandle)read_image(Image,'fix.png')**初始化显示dev_close_window()get_image_size(Image,Width,Height)dev_open_window(0,0,512,512,'blac......
  • 模板匹配——set_shape_model_clutter
    通过设置杂波,来准确定位要检测对象;如下图中未设置杂波情况下,匹配结果如(3);如图(4)设置杂波后,匹配结果如图(5)**Createashapemodel.*创建一个模型read_image(ImageModel,'/bga_gap/bga_gap_01.png')gen_circle(ROI,753.869,551.624,28.4027)reduce_domain(Image......
  • 突破编程_C++_C++11新特性(模板的改进与细节)
    1模板右尖括号的改进在C++11之前,模板的解析和实例化过程中,右尖括号>的处理有时会导致一些意外的结果,特别是在嵌套模板或模板模板参数中。这是因为C++编译器通常会试图“查看前方”来确定何时结束模板参数的列表,这有时会导致解析错误。C++11对模板的右尖括号处理进......