好像是线段树的懒标记出现了问题
  • 板块学术版
  • 楼主pencil
  • 当前回复11
  • 已保存回复11
  • 发布时间2021/8/15 12:34
  • 上次更新2023/11/4 10:36:33
查看原帖
好像是线段树的懒标记出现了问题
137723
pencil楼主2021/8/15 12:34
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int n,m,l,r,sum[N],lazy[N],a[N];
void pd(int wz,int l,int r) {
	int mid=(r+l)>>1,lz=lazy[wz];
	sum[wz>>1]+=lz*(mid-l);
	sum[wz>>1|1]+=lz*(r-mid-1);
	lazy[wz>>1]+=lz;
	lazy[wz>>1|1]+=lz;lazy[wz]=0;
}
void update(int k,int zl,int zr,int add) {
	if(l<=zl&&zr<=r) {
		sum[k]+=add*(zr-zl+1);
		lazy[k]+=add;
	}
	if(zl==zr) {
		sum[k]=a[zl];
		return ;
	}
	int mid=(zl+zr)>>1;
	pd(k,zl,zr);
	if(l<=mid)
		update(k<<1,zl,mid,add);
	if(r>mid)
		update(k<<1|1,mid+1,zr,add);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
void build(int k,int l,int r) {
	if(l==r) {
	sum[k]=a[l];	return ;
	}
	int mid=(r+l)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
int qiu(int k,int zl,int zr) {
	if(l<=zl&&zr<=r) {
		return sum[k];
	}
	if(zr==zl)return sum[k];
	int mid=(zl+zr)>>1,ans=0;
	pd(k,zl,zr);
	if(l<=mid)
		ans+=qiu(k<<1,zl,mid);
	if(r>mid)
		ans+=qiu(k<<1|1,mid+1,zr);
	return ans;
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1; i<=m; i++) {
		int o,c;
		cin>>o;
		if(o==1) {
			cin>>l>>r>>c;
			update(1,1,n,c);
		}
		if(o==2) {
			cin>>l>>r;
			cout<<qiu(1,1,n)<<endl;;
		}
	}
	return 0;
}
2021/8/15 12:34
加载中...