有没有大佬能帮忙看下哪里有问题,只得七十分最后三个点不过,蒟蒻求助谢谢谢谢
查看原帖
有没有大佬能帮忙看下哪里有问题,只得七十分最后三个点不过,蒟蒻求助谢谢谢谢
529466
0717lhlh楼主2022/3/21 23:43
#include<bits/stdc++.h>
#define ll long long
const int N=1e5+10;
using namespace std;
int n,m;
int a[N];
struct node{
	int l,r;
	ll lazy,sum;
	
}tr[N<<2];

void pushup(int u){
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}//维护树中的sum值

void build(int u,int aa,int bb){
	tr[u].l=aa;
	tr[u].r=bb;
	if(aa==bb) {
		tr[u].sum=a[aa];
		return;
	}
	int mid=(aa+bb)>>1;
	build(u<<1,aa,mid);
	build(u<<1|1,mid+1,bb);
	pushup(u);//计算u为根的树的sum值
	return; 
}

void pushdown(int u){//懒标记传下去
	if(tr[u].lazy){
		tr[u<<1].lazy+=tr[u].lazy;
		tr[u<<1].sum+=(tr[u<<1].r -tr[u<<1].l+1)*tr[u].lazy;//因为只有含在目标区间内的区间才会被标记
		tr[u<<1|1].lazy+=tr[u].lazy;
		tr[u<<1|1].sum+=(tr[u<<1|1].r -tr[u<<1|1].l+1)*tr[u].lazy;
		 tr[u].lazy=0;
	} 
	return;
}

void modify(int u,int aa,int bb,int k){ //区间加 
	if(aa<=tr[u].l&&bb>=tr[u].r){
		tr[u].lazy+=k;
		tr[u].sum+=(tr[u].r-tr[u].l+1)*k;
		return;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(aa<=mid) modify(u<<1,aa,bb,k);
	if(bb>mid) modify(u<<1|1,aa,bb,k);
	pushup(u);
	return;
}

ll query(int u,int aa,int bb){//区间查询 
	if(aa<=tr[u].l&&bb>=tr[u].r)  return tr[u].sum;
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	int ans=0;
	if(aa<=mid) ans+=query(u<<1,aa,bb);
	if(bb>mid) ans+=query(u<<1|1,aa,bb);
	return ans;
}
int main(){
	int aaa,bbb,ccc,ddd;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>aaa;
		if(aaa==1){
			cin>>bbb>>ccc>>ddd;
			modify(1,bbb,ccc,ddd);
		}
		if(aaa==2){
			cin>>bbb>>ccc;
			cout<<query(1,bbb,ccc)<<endl;
		}
	}
	return 0;
}
2022/3/21 23:43
加载中...