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;
    }
    
  • 相关阅读:
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
    jq 一个强悍的json格式化查看工具
    浅析Docker容器的应用场景
    HDU 4432 Sum of divisors (水题,进制转换)
    HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
    CodeForces 589B Layer Cake (暴力)
    CodeForces 589J Cleaner Robot (DFS,或BFS)
    CodeForces 589I Lottery (暴力,水题)
    CodeForces 589D Boulevard (数学,相遇)
  • 原文地址:https://www.cnblogs.com/tomori/p/13762574.html
Copyright © 2011-2022 走看看