如题,以下是两份代码,代码一到代码二只改了 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;
}