zoukankan      html  css  js  c++  java
  • POJ 3468 A Simple Problem with Integers 线段树区间修改

    区间增加

    区间查询和

    struct Tree {
        int l, r;
        ll sum;
    };
    
    Tree node[maxn * 4];
    ll a[maxn];
    ll lazy[maxn * 4];
    
    void Pushdown(int rt, int m) {
        if (lazy[rt]) {
            lazy[rt << 1] += lazy[rt];
            lazy[rt << 1 | 1] += lazy[rt];
            node[rt << 1].sum += lazy[rt] * (m - (m >> 1));
            node[rt << 1 | 1].sum += lazy[rt] * (m >> 1);
            lazy[rt] = 0;
        }
    }
    
    void Pushup(int i) {
        node[i].sum = node[i << 1].sum + node[i << 1 | 1].sum;
    }
    
    void Build(int i, int l, int r) {
        lazy[i] = 0;
        node[i].l = l;
        node[i].r = r;
        if (l == r) {
            node[i].sum = a[l];
            return;
        }
        int mid = l + r >> 1;
        Build(i << 1, l, mid);
        Build(i << 1 | 1, mid + 1, r);
        Pushup(i);
    }
    
    ll getsum(int i, int l, int r) {
        if (node[i].l == l && node[i].r == r) return node[i].sum;
        int mid = node[i].l + node[i].r >> 1;
        Pushdown(i, node[i].r - node[i].l + 1);
        if (r <= mid) return getsum(i << 1, l, r);
        else if (l > mid) return getsum(i << 1 | 1, l, r);
        else return getsum(i << 1, l, mid) + getsum(i << 1 | 1, mid + 1, r);
    }
    
    void update(int i, int l, int r, ll v) {
        if (node[i].r == r && node[i].l == l) {
            lazy[i] += v;
            node[i].sum += (ll)v * (r - l + 1);
            return;
        }
        if (node[i].l == node[i].r) return;
        int mid = node[i].l + node[i].r >> 1;
        Pushdown(i, node[i].r - node[i].l + 1);
        if (r <= mid) update(i << 1, l, r, v);
        else if (l > mid) update(i << 1 | 1, l, r, v);
        else {
            update(i << 1, l, mid, v);
            update(i << 1 | 1, mid + 1, r, v);
        }
        Pushup(i);
    }
    
    int main() {
        int n, q;
        int l, r;
        char op[3];
        n = readint(), q = readint();
        for (int i = 1; i <= n; i++) a[i] = readll();
        Build(1, 1, n);
        while (q--) {
            scanf("%s", op);
            l = readint(), r = readint();
            if (strcmp(op, "C") == 0) {
                ll val = readll();
                update(1, l, r, val);
            }
            else {
                Put(getsum(1, l, r));
                puts("");
            }
        }
    }
  • 相关阅读:
    select2清除选择(选择框内的值)
    select2使用
    ASP.Net MVC 在ajax接收controller返回值为Json数据
    C# 页面向controller中跳转匹配方法的时候,当controller中有两个重载方法时候,不发生跳转
    Java自学之路(小白向)
    ASP.Net MVC 中EF实体的属性取消映射数据库、自定义名称
    RabbitMQ交换机
    Springboot集成RabbitMQ
    rabbitmq概念简介
    Docker安装rabbitMQ主从
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13450743.html
Copyright © 2011-2022 走看看