zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    leetcode二叉树翻转二叉树
    编译PBRTv2
    人最大的快乐不是赚多少钱,而是将一个一个的梦想付诸实现。
    今天终于把工作的事定下了安心开始新的学习
    Ogre学习(二)
    关于游戏引擎关于心情
    Ogitor的安装与使用
    软件随想录
    Lost in Island
    OGRE学习(一)
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10013266.html
Copyright © 2011-2022 走看看