WA20pts,悬关求助

P3372 【模板】线段树 1

MC_OIer @ 2024-05-04 11:56:33

#include<bits/stdc++.h>
using namespace std;
struct node{
    long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans; 
node rt[400005];
void push_down(long long now){
    rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);
    rt[now*2].p=rt[now].p;
    rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);
    rt[now*2+1].p=rt[now].p;
    rt[now].p=0;
}
void build(long long l,long long r,long long now){
    rt[now].s=l;
    rt[now].t=r;
    rt[now].p=0;
    if(l==r){
        rt[now].v=a[l];
        return;
    }
    long long m=(l+r)/2;
    build(l,m,now*2);
    build(m+1,r,now*2+1);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
    if(rt[now].s>=l&&rt[now].t<=r){
        rt[now].v+=k*(rt[now].t-rt[now].s+1);
        rt[now].p+=k;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    modify(l,r,now*2,k);
    modify(l,r,now*2+1,k);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
    if(rt[now].s>=l&&rt[now].t<=r){
        ans+=rt[now].v;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    query(l,r,now*2);
    query(l,r,now*2+1);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    for(long long i=1;i<=m;i++){
        long long op,l,r,k;
        ans=0;
        cin>>op>>l>>r;
        if(op==2){
            query(l,r,1);
            cout<<ans<<endl;
        }
        else{
            cin>>k;
            modify(l,r,1,k);
        }
    }
    return 0;
}

错的地方全比正解少一,加一完输出全wa


by do_it_tomorrow @ 2024-05-04 21:31:12

#include<bits/stdc++.h>
using namespace std;
struct node{
    long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans; 
node rt[400005];
void push_down(long long now){
    rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);//here
    rt[now*2].p=rt[now].p;
    rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);//here
    rt[now*2+1].p=rt[now].p;
    rt[now].p=0;
}
void build(long long l,long long r,long long now){
    rt[now].s=l;
    rt[now].t=r;
    rt[now].p=0;
    if(l==r){
        rt[now].v=a[l];
        return;
    }
    long long m=(l+r)/2;
    build(l,m,now*2);
    build(m+1,r,now*2+1);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
    if(rt[now].s>=l&&rt[now].t<=r){
        rt[now].v+=k*(rt[now].t-rt[now].s+1);
        rt[now].p+=k;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    modify(l,r,now*2,k);
    modify(l,r,now*2+1,k);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
    if(rt[now].s>=l&&rt[now].t<=r){
        ans+=rt[now].v;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    query(l,r,now*2);
    query(l,r,now*2+1);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    for(long long i=1;i<=m;i++){
        long long op,l,r,k;
        ans=0;
        cin>>op>>l>>r;
        if(op==2){
            query(l,r,1);
            cout<<ans<<endl;
        }
        else{
            cin>>k;
            modify(l,r,1,k);
        }
    }
    return 0;
}

by do_it_tomorrow @ 2024-05-04 21:31:57

不,发错了,在 here 的下面。

#include<bits/stdc++.h>
using namespace std;
struct node{
    long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans; 
node rt[400005];
void push_down(long long now){
    rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);
    rt[now*2].p+=rt[now].p;
    rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);
    rt[now*2+1].p+=rt[now].p;
    rt[now].p=0;
}
void build(long long l,long long r,long long now){
    rt[now].s=l;
    rt[now].t=r;
    rt[now].p=0;
    if(l==r){
        rt[now].v=a[l];
        return;
    }
    long long m=(l+r)/2;
    build(l,m,now*2);
    build(m+1,r,now*2+1);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
    if(rt[now].s>=l&&rt[now].t<=r){
        rt[now].v+=k*(rt[now].t-rt[now].s+1);
        rt[now].p+=k;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    modify(l,r,now*2,k);
    modify(l,r,now*2+1,k);
    rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
    if(rt[now].s>=l&&rt[now].t<=r){
        ans+=rt[now].v;
        return;
    }
    if(rt[now].t<l||rt[now].s>r)return;
    if(rt[now].p)push_down(now); 
    query(l,r,now*2);
    query(l,r,now*2+1);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    for(long long i=1;i<=m;i++){
        long long op,l,r,k;
        ans=0;
        cin>>op>>l>>r;
        if(op==2){
            query(l,r,1);
            cout<<ans<<endl;
        }
        else{
            cin>>k;
            modify(l,r,1,k);
        }
    }
    return 0;
}

by MC_OIer @ 2024-05-08 21:08:44

@do_it_tomorrow 已关,感谢CCCCOrz


by MC_OIer @ 2024-05-08 22:42:19

@do_it_tomorrow 可是为什么我没看出来改了哪里???请大神注明一下呗qwq……orz


by MC_OIer @ 2024-05-08 22:46:04

@do_it_tomorrow 为什么push_down中要用=而不能用+=呢?儿子节点之前有标记怎么办呢


by MC_OIer @ 2024-05-08 22:47:46

oh,sorry我把WA的代码和AC代码看反了(我真是个智障)


by MC_OIer @ 2024-05-08 22:51:22

好的,此帖结


|