线段树求助!
查看原帖
线段树求助!
289275
Terraria楼主2020/12/1 18:24

自测大概是区间赋值出了问题,但就是找不到bug。

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[10000009];
int tree[10000009];
int lazy_tag[10000009];
void build(int l,int r,int p){
	if(l==r){
		tree[p]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,2*p);
	build(mid+1,r,2*p+1);
	tree[p]=tree[p*2]+tree[p*2+1];
}



void updata(int l,int r,int s,int t,int k,int p){
	if(l<=s&&t<=r){
		tree[p]+=(t-s+1)*k;
		lazy_tag[p]+=k;
		return;
	}
	int mid=(s+t)/2;
	if(lazy_tag[p]){
		tree[2*p]+=lazy_tag[p]*(mid-s+1);
		tree[2*p+1]+=lazy_tag[p]*(t-mid);
		lazy_tag[2*p]+=lazy_tag[p];
		lazy_tag[2*p+1]+=lazy_tag[p];
	}
	lazy_tag[p]=0;
	if(l<=mid) updata(l,r,s,mid,k,2*p);
	if(r>mid) updata(l,r,mid+1,t,k,2*p+1);
	tree[p]=tree[p*2]+tree[p*2+1];
}



int getsum(int l,int r,int left,int right,int p){
	if(l>=left&&right>=r) return tree[p];
	int mid=(l+r)/2;
	if(lazy_tag[p]){
		tree[p*2]+=lazy_tag[p]*(mid-left+1);
		tree[p*2+1]+=lazy_tag[p]*(right-mid);
		
	}
	lazy_tag[p]=0;
	int sum=0;
	if(left<=mid) sum+=getsum(l,mid,left,right,2*p);
	if(right>mid) sum+=getsum(mid+1,r,left,right,2*p+1);
	return sum;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			updata(x,y,1,n,k,1);
		}
		if(op==2){
			int x,y;
			cin>>x>>y;
			cout<<getsum(1,n,x,y,1)<<endl;
		}
	}
}
2020/12/1 18:24
加载中...