请大佬解释一下为什么这个写法是错的,不太理解
查看原帖
请大佬解释一下为什么这个写法是错的,不太理解
1060769
chenle123楼主2024/7/24 19:22
#include<bits/stdc++.h>
using namespace std;
long long t[400010],tag[400010],e,w;
long long a[100010],ch[100010],n,m,opt;
long long ll,rr,kk,dd,pp;
void build(int date,int l,int r)
{
	if(l==r)
	{
		t[date]=ch[l];
		return;
	}
	int mid=(l+r)>>1;
	build(date<<1,l,mid);
	build(date<<1|1,mid+1,r);
	t[date]=t[date<<1]+t[date<<1|1];
}
void change(int date,int l,int r,int hl,int hr,int ddd)
{
	if(hl<=l&&r<=hr)
	{
		t[date]=t[date]+(r-l+1)*ddd;
		if(date<<1<=400000)tag[date<<1]+=ddd;
		if(date<<1|1<=400000)tag[date<<1|1]+=ddd;
		return;
	}
	
	int mid=(l+r)>>1;
	if(hl<=mid)change(date<<1,l,mid,hl,hr,ddd);
	if(mid<hr)change(date<<1|1,mid+1,r,hl,hr,ddd);
	t[date]=t[date<<1]+t[date<<1|1];
}
long long ask(int date,int l,int r)
{
	if(tag[date]!=0)
	{
		t[date]+=(r-l+1)*tag[date];
		if(date<<1<=400000)tag[date<<1]+=tag[date];
		if(date<<1|1<=400000)tag[date<<1|1]+=tag[date];
		tag[date]=0;
	}
	if(r<=pp)return t[date];
	int mid=(l+r)>>1;
	if(pp<=mid)return ask(date<<1,l,mid);
	else return ask(date<<1,l,mid)+ask(date<<1|1,mid+1,r);
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		ch[i]=a[i]-a[i-1];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld",&opt);
		if(opt==1)
		{
			scanf("%lld%lld%lld%lld",&ll,&rr,&kk,&dd);
			change(1,1,n,ll,ll,kk);
			if(ll!=rr)change(1,1,n,ll+1,rr,dd);
			w=kk+(rr-ll)*dd;
			if(rr+1<=n)change(1,1,n,rr+1,rr+1,-w);
		}
		else
		{
			scanf("%lld",&pp);
			e=ask(1,1,n);
			printf("%lld\n",e);
		}
	}
	return 0;
 } 
2024/7/24 19:22
加载中...