P3372 【模板】线段树 1 样例都没过,求助,大大滴感谢。
查看原帖
P3372 【模板】线段树 1 样例都没过,求助,大大滴感谢。
551966
jeffrey楼主2023/8/2 08:15
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
int lazy[N],s[N],a[N];
int n,m;
void build(int p,int l,int r)
{
	if(l==r)
	{
		s[p]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	s[p]=s[p*2]+s[p*2+1];
}
int f(int p,int l,int r,int ql,int qr,int k)
{
	if(ql<=l&&qr>=r)
	{
		s[p]+=(r-l+1)*k;
		lazy[p]+=k;
	}
	int mid=(l+r)/2;
	if(lazy[p])
	{
		s[p*2]+=lazy[p]*(mid-l+1);lazy[p*2]+=lazy[p];
		lazy[p*2+1]+=lazy[p];
		s[p*2+1]+=lazy[p]*(r-mid);lazy[p]=0;
	}
	if(ql<=mid) f(p*2,l,mid,ql,qr,k);
	if(qr>mid) f(p*2+1,mid+1,r,ql,qr,k);
}
int sum(int p,int l,int r,int ql,int qr)
{
	if(ql<=l&&qr>=r)
	{
		return s[p];
	}
	int mid=(l+r)/2;
	if(lazy[p])
	{
		s[p*2]+=lazy[p]*(mid-l+1);lazy[p*2]+=lazy[p];
		lazy[p*2+1]+=lazy[p];
		s[p*2+1]+=lazy[p]*(r-mid);lazy[p]=0;
	}
	int ans=0;
	if(ql<=mid) ans+=sum(p*2,l,mid,ql,qr);
	if(qr>mid) ans+=sum(p*2+1,mid+1,r,ql,qr);
	return ans; 
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			f(1,1,n,x,y,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			cout<<sum(1,1,n,x,y)<<endl;
		}
	}
	return 0;
 } 
2023/8/2 08:15
加载中...