10分,线段树,求助
查看原帖
10分,线段树,求助
553772
GLESENA楼主2023/8/4 10:19

第二次来发帖了,

上一次是这和个。

10 pts

输入

8 10
659 463 793 740 374 330 772 681 
1 5 8 39
2 5 8
1 3 6 3
1 5 8 90
1 1 5 21
2 3 8
1 3 8 17
1 4 7 52
2 2 6
1 2 7 41

应该输出

2313
4281
3278

实际输出

2313
4203
3152

求调

代码

#include<bits/stdc++.h>
using namespace std;
#define lc i<<1
#define rc i<<1|1
#define mid (l+r)/2
int inPut[100000+1];
struct tree{
	int l,r,sum,lazytag;
}t[100000001];
void push_down(int i)
{
	t[lc].lazytag+=t[i].lazytag;
	t[rc].lazytag+=t[i].lazytag;
	t[lc].sum+=t[i].lazytag*(t[lc].r-t[lc].l+1);
	t[rc].sum+=t[i].lazytag*(t[rc].r-t[rc].l+1);
	t[i].lazytag=0;
}
void build(int i,int l,int r)
{
	t[i].l=l;t[i].r=r;
	if(l==r)
	{
		t[i].sum=inPut[l];
		return ;
	}
	build(lc,l,mid);
	build(rc,mid+1,r);
	t[i].sum=t[lc].sum+t[rc].sum;
}
int search(int i,int l,int r)
{
	//cout<<t[i].l<<" "<<t[i].r<<' '<<l<<' '<<r<<'\n';
	if(l<=t[i].l&&r>=t[i].r)
	{
		return t[i].sum;
	}
	if(l>t[i].r||r<t[i].l)
	{
		return 0;
	}
	int rtrn=0;
	push_down(i);
	if(l<=t[lc].r)
	{
		rtrn+=search(lc,l,r);
	}
	if(r>=t[rc].l)
	{
		rtrn+=search(rc,l,r);
	}
	return rtrn;
}
void add(int i,int l,int r,int k)
{
	if(l<=t[i].l&&r>=t[i].r)
	{
		t[i].lazytag=k;
		t[i].sum+=(t[i].r-t[i].l+1)*t[i].lazytag;
		return ;
	}
	push_down(i);
	if(l<=t[lc].r)
	{
		add(lc,l,r,k);
	}
	if(r>=t[rc].l)
	{
		add(rc,l,r,k);
	}
	t[i].sum=t[lc].sum+t[rc].sum;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&inPut[i]);
	}
	build(1,1,n);
	int op,x,y,k;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d%d",&x,&y,&k);
			add(1,x,y,k);
		}
		if(op==2)
		{
			scanf("%d%d",&x,&y);
			cout<<search(1,x,y)<<endl;
		}
	}
	return 0;
}

Orz

2023/8/4 10:19
加载中...