hihoCoder week20 线段树的区间修改

Posted draymonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihoCoder week20 线段树的区间修改相关的知识,希望对你有一定的参考价值。

区间修改 区间查询

最后一场比赛前的无可救药的热身

#include <bits/stdc++.h>
using namespace std;
#define mid ((l+r)/2)
#define ls (rt<<1)
#define rs (rt<<1|1)
const int N = 2e5+10;

int n, s[N], tr[N], lz[N];

void build(int rt,int l,int r)
{
    if(l ==r) {
        tr[rt] = s[l];
        return ;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    tr[rt] = tr[ls] + tr[rs];
}

void down(int rt,int l,int r)
{
    if(lz[rt]) {
        lz[ls] = lz[rs] = lz[rt];
        tr[ls] = (mid-l+1) * lz[ls];
        tr[rs] = (r - mid) * lz[rs];
        lz[rt] = 0;
    }
} 

void update(int rt,int l,int r,int L,int R,int val)
{
    if(L <= l && r <= R) {
        lz[rt] = val;
        tr[rt] = val * (r-l+1);
        return ;
    }
    down(rt,l,r);
    if(L<=mid)
        update(ls,l,mid,L,R,val);
    if(R>mid)
        update(rs,mid+1,r,L,R,val);
    tr[rt] = tr[ls] + tr[rs];    
}

long long query(int rt,int l,int r,int L,int R)
{
    if(L <= l && r <= R) {
        return tr[rt];
    }
    down(rt,l,r);
    long long res = 0;
    if(L<=mid)
        res = res + query(ls,l,mid,L,R);
    if(R>mid)
        res = res + query(rs,mid+1,r,L,R);
    return res;
}
void out(int rt,int l,int r)
{
    printf("%d %d %d
", l, r, tr[rt]);
    if(l == r) 
    return ;
    out(ls,l,mid);
    out(rs,mid+1,r);
}
int main()
{
    freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", &s[i]);
    build(1,1,n);
    int m; scanf("%d", &m);
    while(m--) {
        int op,l,r;
        scanf("%d %d %d", &op, &l, &r);
        if(op) {
            int val; scanf("%d", &val);
            update(1,1,n,l,r,val);
            // out(1,1,n);
            //puts("-----");
        }else 
            printf("%lld
", query(1,1,n,l,r));
    }
    return 0;
} 

 

以上是关于hihoCoder week20 线段树的区间修改的主要内容,如果未能解决你的问题,请参考以下文章

hihoCode 1078 : 线段树的区间修改

hihocoder1078 线段树的区间修改

hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询

hihoCoder 1078 区间查询线段树

hiho一下20周 线段树的区间修改

模板 线段树的区间修改