线段树个人模板

第一段代码:维护区间内最大值(单点维护)
<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define rep(i,a,b)	for (int i=a;i<=b;i++)
using namespace std;
const int Max=0x3f3f3f3f;
struct Node{
	int maxi;
	int l,r;
}node[600050];
int n,m,score[200050]={0};
void buildtree(int pos,int l,int r){
	node[pos].l=l,node[pos].r=r;
	if (l==r)	node[pos].maxi=score[l];
	else {
		buildtree(2*pos,l,(l+r)>>1);
		buildtree(2*pos+1,((l+r)>>1)+1,r);
		node[pos].maxi=max(node[2*pos].maxi,node[2*pos+1].maxi);
	}
}
void update(int pos,int k,int val){
	if (val>node[pos].maxi)	node[pos].maxi=val;
	if (node[pos].l==node[pos].r)	return ;
	if (k<=node[2*pos].r)	update(pos*2,k,val);
	else update(pos*2+1,k,val);
}
int query(int pos,int l,int r){
	if (node[pos].l==l&&node[pos].r==r)	return node[pos].maxi;
	if (r<=node[2*pos].r)	return query(pos*2,l,r);
	if (l>=node[2*pos+1].l)	return query(pos*2+1,l,r);
	int v1=query(pos*2,l,node[pos*2].r),v2=query(pos*2+1,node[2*pos+1].l,r);
	return (max(v1,v2));
}
int main(){
	scanf("%d%d",&n,&m);
	rep(i,1,n)	scanf("%d",&score[i]);
	getchar();
	buildtree(1,1,n);
	char c;
	int a,b;
	rep(i,1,m){
		scanf("%c%d%d",&c,&a,&b);
		getchar();
		if (c=='U')	update(1,a,b);
		else	printf("%d\n",query(1,a,b));
	}
	return 0;
}


 
 
第二段代码:维护一段区间和,能够对一段区间进行更新(区间维护)
#include<iostream>
#include<cstdio>
#include<cstring>
#define rep(i,a,b)	for (int i=a;i<=b;i++)
using namespace std;
struct Node{
	int sum,l,r;
}node[3000];
int n,m,num[3000]={0};
void build(int k,int l,int r){
	node[k].l=l,node[k].r=r;
	if (l==r)	node[k].sum=num[l];
	else{
		build(2*k,l,(l+r)>>1);
		build(2*k+1,((l+r)>>1)+1,r);
		node[k].sum=node[2*k].sum+node[2*k+1].sum;
	}
}
void update(int k,int l,int r,int x){
	if (l<=node[k].l&&r<=node[k].r)	node[k].sum+=(r-l+1)*x;
	if (node[k].l==node[k].r)	return ;
	if (l<=node[2*k].r)	update(2*k,l,node[2*k].r,x);
	if (r>=node[2*k+1].l)	update(2*k+1,node[2*k+1].l,r,x);
}
int query(int k,int l,int r){
	if (l==node[k].l&&r==node[k].r)	return node[k].sum;
	if (r<=node[2*k].r)	return query(2*k,l,r);
	if (l>=node[2*k+1].l)	return query(2*k+1,l,r);
	return query(2*k,l,node[2*k].r)+query(2*k+1,node[2*k+1].l,r);
}
int main(){
	scanf("%d%d",&n,&m);
	rep(i,1,n)	scanf("%d",&num[i]);
	build(1,1,n);
	getchar();
	char c;
	int a,b,x;
	rep(i,1,m){
		scanf("%c",&c);
		if (c=='U'){
			scanf("%d%d%d",&a,&b,&x);
			getchar();
			update(1,a,b,x);
		}else{
			scanf("%d%d",&a,&b);
			getchar();
			printf("%d\n",query(1,a,b));
		}
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值