70pts wa求条
查看原帖
70pts wa求条
743650
sadly_shark楼主2024/8/11 11:39

WA#8,#9,#10三个点,代码如下,玄关

#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
struct node{
	int l;
	int r;
	int lazy;
	int sum;
}tr[400010];
long long a[100010],n,m,op,x,y,k;

void putup(int p){
	tr[p].sum=tr[ls].sum+tr[rs].sum; 
	return;
}

void putdown(int p){
	if(tr[p].lazy){
		tr[ls].lazy+=tr[p].lazy;
		tr[rs].lazy+=tr[p].lazy;
		tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tr[p].lazy;
		tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tr[p].lazy;
		tr[p].lazy=0;
	}
	return;
}
void xiugai(int left,int right,int kk,int p=1){
	if(tr[p].l>=left&&tr[p].r<=right){
		tr[p].lazy+=kk;
		tr[p].sum+=(tr[p].r-tr[p].l+1)*kk;
		return;
	}
	putdown(p);
	if(left<=tr[ls].r)xiugai(left,right,kk,ls);
	if(right>=tr[rs].l)xiugai(left,right,kk,rs);
	putup(p);
}

long long qiuhe(int left,int right,int p=1){
	if(tr[p].l>=left&&tr[p].r<=right)return tr[p].sum;
	putdown(p);
	long long ans=0;
	if(left<=tr[ls].r)ans+=qiuhe(left,right,ls);
	if(right>=tr[rs].l)ans+=qiuhe(left,right,rs);
	return ans;
}

void build(int left,int right,int p=1){
	tr[p].l=left;
	tr[p].r=right;
	if(tr[p].l==tr[p].r){
		tr[p].sum=a[left];
		return;
	}
	int mid=(left+right)>>1;
	build(left,mid,ls);
	build(mid+1,right,rs);
	putup(p);
}

int main(){
	//freopen("in.in","r",stdin); 
	//freopen("solution.out","w",stdout); 
	
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,n);
	while(m--){
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			xiugai(x,y,k);
		}
		else{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",qiuhe(x,y));
		}
	}
	
	return 0;
}
2024/8/11 11:39
加载中...