怎么的就进入了死循环了?

P3372 【模板】线段树 1

qinziao @ 2024-08-19 15:36:06

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll n,m;
ll a[N],tr[N<<2],tag[N<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void f(ll p,ll l,ll r,ll k)
{
    tr[p]+=(r-l+1)*k;
    tag[p]+=k;
}
void push_up(ll p)
{
    tr[p]=tr[ls(p)]+tr[rs(p)];  
}
void push_down(ll p,ll l,ll r)
{
    ll mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p]);
    f(rs(p),mid+1,r,tag[p]);
    tag[p]=0;
}
void build(ll p,ll l,ll r)
{
    if(l==r)
    {
        tr[p]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}
void update(ll nl,ll nr,ll k,ll p,ll l,ll r)
{
    if(nl<=l&&r<=nr)
    {
        tr[p]+=(r-l+1)*k;
        tag[p]+=k;
        return;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(nl<=mid) 
        update(nl,nr,k,ls(p),l,mid);
    if(mid+1<=nr)
        update(nl,nr,k,rs(p),mid+1,r);
    push_up(p);
}
ll query(ll nl,ll nr,ll p,ll l,ll r)
{
    if(nl<=l&&r<=nr) return tr[p];
    ll res=0,mid=(l+r)>>1;
    push_down(p,l,r);
    if(nl<=mid)
        res+=query(nl,nr,ls(p),l,mid);
    if(mid+1<=r)
        res+=query(nl,nr,rs(p),mid+1,r);
    return res;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
        scanf("%lld",&a[i]);
    build(1,1,n);
    while(m--)
    {
        ll p;
        scanf("%lld",&p);
        if(p==1){
            ll nl,nr,k;
            scanf("%lld%lld%lld",&nl,&nr,&k);
            update(nl,nr,k,1,1,n);
        }
        if(p==2){
            ll l,r;
            scanf("%lld%lld",&l,&r);
            printf("%lld\n",query(l,r,1,1,n));
        }
    }

    return 0;
}

by 鶴守丶葉七 @ 2024-08-19 15:44:36

@qinziao
query里要判断是否区间无交,无交就直接返回

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll n,m;
ll a[N],tr[N<<2],tag[N<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void f(ll p,ll l,ll r,ll k)
{
    tr[p]+=(r-l+1)*k;
    tag[p]+=k;
}
void push_up(ll p)
{
    tr[p]=tr[ls(p)]+tr[rs(p)];  
}
void push_down(ll p,ll l,ll r)
{
    ll mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p]);
    f(rs(p),mid+1,r,tag[p]);
    tag[p]=0;
}
void build(ll p,ll l,ll r)
{
    if(l==r)
    {
        tr[p]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}
void update(ll nl,ll nr,ll k,ll p,ll l,ll r)
{
    if(nl<=l&&r<=nr)
    {
        tr[p]+=(r-l+1)*k;
        tag[p]+=k;
        return;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(nl<=mid) 
        update(nl,nr,k,ls(p),l,mid);
    if(mid+1<=nr)
        update(nl,nr,k,rs(p),mid+1,r);
    push_up(p);
}
ll query(ll nl,ll nr,ll p,ll l,ll r)
{
    if(nl<=l&&r<=nr) return tr[p];
    ll res=0,mid=(l+r)>>1;
    push_down(p,l,r);
    if(l>nr||r<nl)
        return 0;
    res+=query(nl,nr,ls(p),l,mid)+query(nl,nr,rs(p),mid+1,r);
    return res;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
        scanf("%lld",&a[i]);
    build(1,1,n);
    while(m--)
    {
        ll p;
        scanf("%lld",&p);
        if(p==1){
            ll nl,nr,k;
            scanf("%lld%lld%lld",&nl,&nr,&k);
            update(nl,nr,k,1,1,n);
        }
        if(p==2){
            ll l,r;
            scanf("%lld%lld",&l,&r);
            printf("%lld\n",query(l,r,1,1,n));
        }
    }

    return 0;
}

by Fur_Zes @ 2024-08-19 15:44:46

@qinziao 我嘞个秦始皇,不要用tag作为变量名喵喵


by Exp10re @ 2024-08-19 15:47:45

@qinziao 第 61 行的 mid+1<=r 改成 mid+1<=nr


by qinziao @ 2024-08-19 15:50:56

@Exp10re 谢谢,关注为敬


by qinziao @ 2024-08-19 15:53:35

@As2O3 【捂脸】


by qinziao @ 2024-08-19 15:54:21

@Meteor_Vi 谢谢,关注为敬


|