第一段代码:维护区间内最大值(单点维护)
第二段代码:维护一段区间和,能够对一段区间进行更新(区间维护)
<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;
}