社区讨论

95pts求条,WA on #19

P3372【模板】线段树 1参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlhgn0z3
此快照首次捕获于
2026/02/11 11:18
上周
此快照最后确认于
2026/02/12 22:10
7 天前
查看原帖
不知道为什么WA了,复习线段树时写的,感觉和之前写得没什么区别就是WA了
CPP
#include<bits/stdc++.h>
#define cin io
using namespace std;
typedef long long ll;
struct IO
{
    char buf[1<<20],*p,*pp;
    IO():p(buf),pp(buf){}
    #define gc() (p==pp&&(pp=buf+fread(buf,1,1<<20,stdin),p=buf),p==pp?EOF:*p++)
    template<typename T>IO&operator>>(T&x){x=0;char c=gc();bool f=0;while(c<'0'||c>'9')f|=(c=='-'),c=gc();while(c>='0'&&c<='9')x=x*10+(c^48),c=gc();if(f)x=-x;return*this;}
}io;
const int N=1e5+5;
int n,m;
int a[N];
struct Seg
{
    #define ls (u<<1)
    #define rs (u<<1|1)
    struct Node
    {
        int l,r;
        ll sum,tag;
    }tr[N<<2];
    inline void pushup(int u){tr[u].sum=tr[ls].sum+tr[rs].sum;}
    inline void pushdown(int u)
    {
        if(tr[u].tag)
        {
            ll tag=tr[u].tag;
            tr[ls].tag+=tag;
            tr[rs].tag+=tag;
            tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tag;
            tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tag;
            tr[u].tag=0;
        }
    }
    void build(int u,int l,int r)
    {
        tr[u]={l,r,0,0};
        if(l==r)
        {
            tr[u].sum=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(u);
    }
    void update(int u,int l,int r,ll v)
    {
        if(l<=tr[u].l&&tr[u].r<=r)
        {
            tr[u].sum+=(tr[u].r-tr[u].l+1)*v;
            tr[u].tag+=v;
            return;
        }
        int mid=(tr[u].l+tr[u].r)>>1;
        pushdown(u);
        if(l<=mid) update(ls,l,r,v);
        if(r>mid) update(rs,l,r,v); 
        pushup(u);
    }
    ll query(int u,int l,int r)
    {
        
        if(l<=tr[u].l&&tr[u].r<=r) return tr[u].sum;
        pushdown(u);
        ll res=0;
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid) res+=query(ls,l,r);
        if(r>mid) res+=query(rs,l,r);
        return res;
    }
}seg;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    seg.build(1,1,n);
    while(m--)
    {
        int op,l,r;
        cin>>op>>l>>r;
        if(op==1) 
        {
            ll v;
            cin>>v;
            seg.update(1,l,r,v);
        }
        if(op==2) printf("%lld\n",seg.query(1,l,r));
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...