求大哥帮调一下p3372区间线段树,刚学2天
查看原帖
求大哥帮调一下p3372区间线段树,刚学2天
754658
haha_hua楼主2022/11/20 21:08

样例都过不去...

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[500005],val[500005],d[500005];
char ch;

ll read(){
	ll s = 0,w = 1;
	ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <='9'){
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	return s * w;
}

void build(int x,int l,int r){
	
	if(l == r){
		a[x] = val[l];
		return ;
	}
	int mid = (l + r) / 2;
	build(2*x,l,mid);
	build(2*x+1,mid+1,r);
	a[x] = a[2*x] + a[2*x+1];
	return ;
}

void pushdown(int x,int l,int r,int mid){
	if(d[x] == 0) return ;
	d[2*x] += d[x];
	a[2*x] += d[x]*(mid - l + 1);
	d[2*x+1] += d[x];
	a[2*x+1] += d[x]*(r - mid);
	d[x] = 0;
	return ;
}

ll chax(int x,int l,int r,int el,int er){
	
	if(l == el && r == er){
		return a[x];
	}
	int mid = (l + r) /2;
	pushdown(x,l,r,mid);
	if(el <= mid && er > mid){
		return chax(2*x,l,mid,el,mid) + chax(2*x+1,mid+1,r,mid+1,er);
	} else if(er <= mid){
		chax(2*x,l,mid,el,er);
	} else{
		chax(2*x+1,mid+1,r,el,er);
	}
	
}

void xiug(int x,int l,int r,int el,int er,ll z){
	
	if(el == l && er == r){
		d[x] += z;
		a[x] += z*(r-l+1);
		return ;
	}
	int mid = (l + r) / 2;
	pushdown(x,l,r,mid);
	if(el <= mid && er > mid){
		xiug(2*x,l,mid,el,mid,z);
		xiug(2*x+1,mid+1,r,mid+1,er,z);
	} else if(er <= mid){
		xiug(2*x,l,mid,el,er,z);
	} else{
		xiug(2*x+1,mid+1,r,el,er,z);
	}
	return ;
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		val[i] = read();
	}
	
	build(1,1,n);
	
	ll l,r,p,x;
	for(int i = 1; i <= m; i++){
		p = read(),l = read(),r = read();
		if(p == 1){
			x = read();
			xiug(1,1,n,l,r,x);	
		} 
		else{
			printf("%lld\n",chax(1,1,n,l,r));
		}
	}
	
	return 0;
}
2022/11/20 21:08
加载中...