实在不明白两个有什么区别
查看原帖
实在不明白两个有什么区别
115786
麦子楼主2023/10/14 23:44

如题,以下是两份代码,代码一到代码二只改了 res变量定义位置,结果差异巨大(代码一能过,代码二不能过样例)

代码一:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=100001;
ll tr[N<<2],tag[N<<2],a[N],n,m;
ll ls(ll p)
{
	return p<<1;
}
ll rs(ll p)
{
	return p<<1|1;
}
void pushup(ll t)
{
	tr[t]=tr[ls(t)]+tr[rs(t)];
}
void build(ll p,ll l,ll r)
{
	tag[p]=0;
	if(l==r)
	{
		tr[p]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void lazy(ll p,ll l,ll r,ll k)
{
	tag[p]+=k;
	tr[p]+=k*(r-l+1);
}
void pushdown(ll p,ll l,ll r)
{
	if(tag[p])
	{
		ll mid=(l+r)>>1;
		lazy(ls(p),l,mid,tag[p]);
		lazy(rs(p),mid+1,r,tag[p]);
		tag[p]=0;
	}
}
void qjxg(ll x,ll y,ll p,ll l,ll r,ll k)
{
	if(x<=l&&r<=y)
	{
		lazy(p,l,r,k);
		return;
	}
	pushdown(p,l,r);
	ll mid=(l+r)>>1;
	if(x<=mid)qjxg(x,y,ls(p),l,mid,k);
	if(y>mid)qjxg(x,y,rs(p),mid+1,r,k);
	pushup(p);
}
ll qjcx(ll x,ll y,ll p,ll l,ll r)
{
	if(x<=l&&r<=y)
	{
		return tr[p];
	}
	pushdown(p,l,r);
	ll res=0;
	ll mid=(l+r)>>1;
	if(x<=mid)res+=qjcx(x,y,ls(p),l,mid);
	if(y>mid)res+=qjcx(x,y,rs(p),mid+1,r);
	return res;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(ll i=1;i<=m;i++)
	{
		ll c,x,k,y;
		scanf("%lld",&c);
		if(c==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			qjxg(x,y,1,1,n,k);
		}
		if(c==2)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",qjcx(x,y,1,1,n));
		}
	}
	return 0;
}

代码二:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=100001;
ll tr[N<<2],tag[N<<2],a[N],n,m,res;
ll ls(ll p)
{
	return p<<1;
}
ll rs(ll p)
{
	return p<<1|1;
}
void pushup(ll t)
{
	tr[t]=tr[ls(t)]+tr[rs(t)];
}
void build(ll p,ll l,ll r)
{
	tag[p]=0;
	if(l==r)
	{
		tr[p]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void lazy(ll p,ll l,ll r,ll k)
{
	tag[p]+=k;
	tr[p]+=k*(r-l+1);
}
void pushdown(ll p,ll l,ll r)
{
	if(tag[p])
	{
		ll mid=(l+r)>>1;
		lazy(ls(p),l,mid,tag[p]);
		lazy(rs(p),mid+1,r,tag[p]);
		tag[p]=0;
	}
}
void qjxg(ll x,ll y,ll p,ll l,ll r,ll k)
{
	if(x<=l&&r<=y)
	{
		lazy(p,l,r,k);
		return;
	}
	pushdown(p,l,r);
	ll mid=(l+r)>>1;
	if(x<=mid)qjxg(x,y,ls(p),l,mid,k);
	if(y>mid)qjxg(x,y,rs(p),mid+1,r,k);
	pushup(p);
}
ll qjcx(ll x,ll y,ll p,ll l,ll r)
{
	if(x<=l&&r<=y)
	{
		return tr[p];
	}
	pushdown(p,l,r);
	res=0;
	ll mid=(l+r)>>1;
	if(x<=mid)res+=qjcx(x,y,ls(p),l,mid);
	if(y>mid)res+=qjcx(x,y,rs(p),mid+1,r);
	return res;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(ll i=1;i<=m;i++)
	{
		ll c,x,k,y;
		scanf("%lld",&c);
		if(c==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			qjxg(x,y,1,1,n,k);
		}
		if(c==2)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",qjcx(x,y,1,1,n));
		}
	}
	return 0;
}
2023/10/14 23:44
加载中...