1 条题解

  • 2
    @ 2025-10-8 17:12:14

    C02【模板】线段树+懒标记 Luogu P3372 线段树

    #include <bits/stdc++.h>
    using namespace std;
    #define lc(p) (p<<1)
    #define rc(p) (p<<1|1)
    const int N=2e5+10;
    typedef long long ll;
    int a[N];
    struct trnode{
        int l,r;
        ll mi,s,lazy;
    }tr[N<<2];
    void pushup(int p)
    {
        tr[p].mi=min(tr[lc(p)].mi,tr[rc(p)].mi);
        tr[p].s=tr[lc(p)].s+tr[rc(p)].s;
    }
    void pushdown(int p)
    {
        if(tr[p].lazy)
        {
            tr[lc(p)].lazy+=tr[p].lazy;
            tr[lc(p)].mi+=tr[p].lazy;
            tr[lc(p)].s+=1ll*(tr[lc(p)].r-tr[lc(p)].l+1)*tr[p].lazy;
    
            tr[rc(p)].lazy+=tr[p].lazy;
            tr[rc(p)].mi+=tr[p].lazy;
            tr[rc(p)].s+=1ll*(tr[rc(p)].r-tr[rc(p)].l+1)*tr[p].lazy;
    
            tr[p].lazy=0;
        }
    }
    void bt(int p,int l,int r)
    {
        tr[p]={l,r,0ll,0ll,0ll};
        if(l==r){tr[p].mi=tr[p].s=a[l];return;}
        int m=(l+r)>>1;
        bt(lc(p),l,m);bt(rc(p),m+1,r);
        pushup(p);
    }
    void change(int p,int l,int r,int k)
    {
        if(r<tr[p].l||tr[p].r<l)return;
        if(l<=tr[p].l&&tr[p].r<=r)
        {
            tr[p].lazy+=k;
            tr[p].mi+=k;
            tr[p].s+=1ll*(tr[p].r-tr[p].l+1)*k;
            return;
        }
        pushdown(p);
        change(lc(p),l,r,k);
        change(rc(p),l,r,k);
        pushup(p);
    }
    ll query1(int p,int l,int r)
    {
        if(r<tr[p].l||tr[p].r<l) return (1ll<<60);
        if(l<=tr[p].l&&tr[p].r<=r) return tr[p].mi;
        pushdown(p);
        return min(query1(lc(p),l,r),query1(rc(p),l,r));
    }
    ll query2(int p,int l,int r)
    {
        if(r<tr[p].l||tr[p].r<l)return 0;
        if(l<=tr[p].l&&tr[p].r<=r)return tr[p].s;
        pushdown(p);
        return query2(lc(p),l,r)+query2(rc(p),l,r);
    }
    int main()
    {
        int n,q;scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        bt(1,1,n);
        for(int i=1,L,R,C;i<=q;i++)
        {
            char op[5];scanf("%s%d%d",op,&L,&R);
            if(op[0]=='M')     printf("%lld\n",query1(1,L,R));
            else if(op[0]=='S')printf("%lld\n",query2(1,L,R));
            else 
            {
                scanf("%d",&C);
                change(1,L,R,C);
            }
        }
        return 0;
    }
    
    • 1

    C02*【线段树】一维区间修改+区间询问[USACO15DEC] Counting Haybale P

    信息

    ID
    6714
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    278
    已通过
    40
    上传者