社区讨论

求助

P3372【模板】线段树 1参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7ygu1n
此快照首次捕获于
2025/11/21 05:40
4 个月前
此快照最后确认于
2025/11/21 05:40
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#define MAXN 1000100
using namespace std;
typedef long long ll;
ll n,m,a[MAXN],b[MAXN],tree[MAXN];
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();};
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();};
	return x*f;
}
inline void lx(ll k,ll root,ll l,ll r){
	b[root]=b[root]+k;
	tree[root]=tree[root]+k*(r-l+1);
}
inline void build(ll l,ll r,ll root){
	b[root]=0;
	if(l==r){
		tree[root]=a[l];
		return ;
	}
	ll mid=(l+r)>>1;
    build(l,mid,root*2);
    build(mid+1,r,root*2+1);
    tree[root]=tree[root*2]+tree[root<<1|1];
    return ;
}
inline void pushdown(ll root,ll l,ll r){
	/*if(b[root]==0){
		return ;
	}*/
	ll mid=(l+r)>>1;
    /*b[root<<1]+=b[root];
    tree[root<<1]+=b[root]*(mid-l+1);
    b[root<<1|1]+=b[root];
    tree[root<<1|1]+=b[root]*(r-(mid+1)+1);*/
    lx(b[root],root<<1,l,mid);
    lx(b[root],root<<1|1,mid+1,r);
    b[root]=0;
    return ;
}
inline void add(ll l,ll r,ll k,ll x,ll y,ll root){
	if(l<=x&&r>=y){
		tree[root]+=k*(x-y+1);
        //b[root*2]+=k;
        //b[root*2+1]+=k;
        b[root]+=k;
        return ;
	}
	pushdown(root,x,y);
    ll mid=(x+y)>>1;
    if(l<=mid){
    	add(l,r,k,x,mid,root<<1);
    }
    if(r>mid){
    	add(l,r,k,mid+1,y,root<<1|1);
    }
    tree[root]=tree[root*2]+tree[root<<1|1];
    return ;
}
inline ll que(ll x,ll y,ll l,ll r,ll root){
	ll ans=0;
	if(l<=x&&y<=r){
		return tree[root];
	}
	pushdown(root,x,y);
	ll mid=(x+y)>>1;
	if(l<=mid){
		ans+=que(x,mid,l,r,root<<1);
	}
	if(r>mid){
		ans+=que(mid+1,y,l,r,root<<1|1);
	}
	return ans;
}
int main(){
	int i,j;
	n=read();m=read();
	for(i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,n,1);
	int f;
	ll x,y,k;
	for(i=1;i<=m;i++){
		f=read();x=read();y=read();
		if(f==1){
			k=read();
			add(x,y,k,1,n,1);
		}else{
			printf("%lld\n",que(1,n,x,y,1));
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...