zoukankan      html  css  js  c++  java
  • P3372 【模板】线段树 1

    初识懒标记。。。

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    #define LL long long
    
    const int N = 100010;
    
    struct Node{
        int l, r;
        LL sum;
        LL add; // lazy
    }tr[N * 4];
    
    int n, m;
    LL w[N];
    
    void update(int u, LL w){
        int len = tr[u].r - tr[u].l + 1;
        tr[u].sum += w * len;
        tr[u].add += w;
    }
    
    void pushdown(int u){
        update(u << 1, tr[u].add);
        update(u << 1 | 1, tr[u].add);
        tr[u].add = 0;
    }
    
    void pushup(int u){
        tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
    }
    
    void build(int u, int l, int r){
        if(l == r) tr[u] = {l, r, w[l]};
        else{
            tr[u] = {l, r};
            int mid = l + r >> 1;
            build(u << 1, l, mid);
            build(u << 1 | 1, mid + 1, r);
            pushup(u);
        }
    }
    
    void modify(int u, int x, LL v){
        if(tr[u].l == tr[u].r) tr[u].sum += v;
        else{
            int mid = tr[u].l + tr[u].r >> 1;
            if(x <= mid) modify(u << 1, x, v);
            else modify(u << 1 | 1, x, v);
        }
    }
    
    LL query(int u, int l, int r){
        if(l <= tr[u].l && r >= tr[u].r) return tr[u].sum;
        if(tr[u].add) pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        
        LL sum = 0;
        if(l <= mid) sum = query(u << 1, l, r);
        if(r > mid) sum += query(u << 1 | 1, l, r);
        
        return sum;
    }
    
    void change(int u, int l, int r, LL v){
        if(tr[u].l == l && tr[u].r == r){
            update(u, v);
            return;
        }
        
        if(tr[u].add) pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if(r <= mid) change(u << 1, l, r, v);
        else if(l > mid) change(u << 1 | 1, l, r, v);
        else{
            change(u << 1, l, mid, v);
            change(u << 1 | 1, mid + 1, r, v);
        }
        pushup(u);
    }
    
    
    
    int main(){
        cin >> n >> m;
        
        for(int i = 1; i <= n; i ++) scanf("%lld", &w[i]);
        
        build(1, 1, n);
        
        while(m --){
            int k, x, y;
            cin >> k >> x >> y;
            
            if(k == 1){
                LL v;
                cin >> v;
                change(1, x, y, v);
            }else
                cout << query(1, x, y) << endl;
        }
        
        return 0;
    }
    
  • 相关阅读:
    C++中的异常
    Hadoop YARN介绍
    js处理层级数据结构的一些总结
    Python数据结构
    Python的编码风格
    Python流程控制
    java中面试可能会问的问题
    深度学习
    Pescal Triangle Two
    Pascal Triangle
  • 原文地址:https://www.cnblogs.com/tomori/p/13762574.html
Copyright © 2011-2022 走看看