WA on #20求条
查看原帖
WA on #20求条
1345652
Luliuyan114514楼主2025/7/29 20:15

代码:

#include<iostream>
#include<vector>
using namespace std;
long long a[1000005];
struct SegTree
{
    struct node
    {
        int l,r;
        long long tag,sum;
        node() { l=r=0; tag=sum=0ll; }
    };
    vector<node> tree;
    SegTree() { tree=vector<node>(); }
    SegTree(int N) { tree.resize(4*N+1); }
    SegTree(int N,long long* a) { tree.resize(4*N+1); build_tree(1,N,1,a); }
    int lson(int u) { return u<<1; }
    int rson(int u) { return (u<<1)|1; }
    void add_tag(int u,long long tag)
    {
        tree[u].tag+=tag;
        tree[u].sum+=(tree[u].r-tree[u].l+1)*tag;
    }
    void down_tag(int u)
    {
        if(tree[u].tag==0)return;
        add_tag(lson(u),tree[u].tag);
        add_tag(rson(u),tree[u].tag);
        tree[u].tag=0;
    }
    void update_node(int u) { tree[u].sum=tree[lson(u)].sum+tree[rson(u)].sum; }
    void build_tree(int l,int r,int u,long long* a)
    {
        if(l>r)return;
        tree[u].l=l;
        tree[u].r=r;
        if(r==l)
        {
            tree[u].sum=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build_tree(l,mid,lson(u),a);
        build_tree(mid+1,r,rson(u),a);
        update_node(u);
    }
    void range_add(int l,int r,int u,long long add)
    {
        if(l<=tree[u].l&&tree[u].r<=r)
        {
            add_tag(u,add);
            return;
        }
        int mid=(tree[u].l+tree[u].r)>>1;
        down_tag(u);
        if(l<=mid) range_add(l,r,lson(u),add);
        if(mid<r) range_add(l,r,rson(u),add);
        update_node(u);
    }
    long long range_query(int l,int r,int u)
    {
        if(l<=tree[u].l&&tree[u].r<=r) return tree[u].sum;
        int mid=(tree[u].l+tree[u].r)>>1;
        long long ans=0;
        down_tag(u);
        if(l<=mid) ans+=range_query(l,r,lson(u));
        if(mid<r) ans+=range_query(l,r,rson(u));
        return ans;
    }
};
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
    }
    SegTree Tr(n,a);
    for(int i=1;i<=m;++i)
    {
        int op,l,r,k;
        cin>>op>>l>>r;
        if(op==1)
        {
            cin>>k;
            Tr.range_add(l,r,1,k);
        }
        else
        {
            cout<<Tr.range_query(l,r,1)<<'\n';
        }
    }
    return 0;
}

评测显示“在第一行的答案太短”

2025/7/29 20:15
加载中...