线段树+懒标记 题解 100% AC
2026-04-25 20:48:27
发布于:浙江
5阅读
0回复
0点赞
懒标记优化!!!否则TLE!!!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=400005;
ll t[4*N],lazy[4*N],a[N];
int n,m;
void build(int k,int l,int r){
if(l==r){
t[k]=a[l];
return;
}
int mid=l+r>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
t[k]=t[2*k]+t[2*k+1];
}
void updown(int k,int l,int mid,int r){
if(lazy[k]){
int ls=k<<1,rs=ls+1;
t[ls]+=(mid-l+1)*lazy[k];
lazy[ls]+=lazy[k];
t[rs]+=(r-mid)*lazy[k];
lazy[rs]+=lazy[k];
lazy[k]=0;
}
}
void add(int k,int l,int r,int x,int y,ll z){
if(r<x||l>y)return;
if(l>=x&&r<=y){
t[k]+=(r-l+1)*z;
lazy[k]+=z;
return;
}
int mid=l+r>>1;
updown(k,l,mid,r);
if(x<=mid)add(2*k,l,mid,x,y,z);
if(y>mid)add(2*k+1,mid+1,r,x,y,z);
t[k]=t[2*k]+t[2*k+1];
}
ll query(int k,int l,int r,int x,int y){
if(r<x||l>y)return 0;
else if(l>=x&&r<=y)return t[k];
int mid=l+r>>1;
updown(k,l,mid,r);
return query(2*k,l,mid,x,y)+query(2*k+1,mid+1,r,x,y);
}
int main(){
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 c,x,y;
cin>>c>>x>>y;
if(c==1){
int z;
cin>>z;
add(1,1,n,x,y,z);
}
else cout<<query(1,1,n,x,y)<<endl;
}
return 0;
}
这里空空如也







有帮助,赞一个