线段树不过样例求助
查看原帖
线段树不过样例求助
713562
hahaxiang楼主2022/10/6 21:21
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100001];
int tree[400001];
int lazy[400001];
int build(int l,int r,int x)
{
	if(l!=r)
	{
		return tree[x]=build(l,(l+r)/2,x*2)+build((l+r)/2+1,r,x*2+1);
	}
	else
	{
		return tree[x]=a[l];
	}
}
int getsum(int l,int r,int l1,int r1,int x)
{
	if(l1>=l&&r1<=r)
	return tree[x];
	int sum=0;
	if(lazy[x]!=0)
	{
		lazy[x*2]+=lazy[x];
		lazy[x*2+1]+=lazy[x];
		tree[x*2]+=lazy[x]*((l1+r1)/2-l1+1);
		tree[x*2+1]+=lazy[x]*(r1-((l1+r1)/2+1)+1);
		lazy[x]=0;
	}
	if(l<=(l1+r1)/2)
	sum+=getsum(l,r,l1,(l1+r1)/2,x*2);
	if(r>=(l1+r1)/2+1)
	sum+=getsum(l,r,(l1+r1)/2+1,r1,x*2+1);
	return sum;
}
void getlazy(int l,int r,int l1,int r1,int x,int k)
{
	if(l1>=l&&r1<=r)
	{
		tree[x]+=(r1-l1+1)*k;
		lazy[x]=k;
		return;
	}
	if(l<=(l1+r1)/2)
	getlazy(l,r,l1,(l1+r1)/2,x*2,k);
	if(r>=(l1+r1)/2+1)
	getlazy(l,r,(l1+r1)/2+1,r1,x*2+1,k);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			getlazy(x,y,1,n,1,k);
		}
		if(op==2)
		{
			int x,y;
			cin>>x>>y;
			cout<<getsum(x,y,1,n,1)<<endl;
		}
	}
}
2022/10/6 21:21
加载中...