zoukankan      html  css  js  c++  java
  • 线段树(区间修改)

    #include <iostream>
    #include <cctype>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <string>
    #include <stack>
    
    using namespace std;
    
    #define ll long long
    
    inline int read() {
        int x = 0,ff = 1; char ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        } 
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        return x * ff;
    }
    
    inline void write(ll x) {
        if(x < 0) putchar('-'),x = -x;
        if(x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
    
    const int INF = 0x3f3f3f3f;
    const int MAXN = 5e5 + 100;
    const int MAXM = 3e3 + 10;
    
    int n,m,a[MAXN];
    struct Tree {
        int left,right;
        ll sum,add;
        #define l(x) t[x].left
        #define r(x) t[x].right
        #define sum(x) t[x].sum
        #define add(x) t[x].add
    }t[MAXN];
    
    void build(int p,int l,int r) {
        l(p) = l; r(p) = r;
        if(l == r) {sum(p) = a[l]; return ; }
        int mid = (l + r) / 2;
        build(p * 2,l,mid);
        build(p * 2 + 1,mid + 1,r);
        sum(p) = sum(p * 2) + sum(p * 2 + 1);
    }
    
    void spread(int p) {
        if(add(p)) {
            sum(p * 2) += add(p) * (r(p * 2) - l(p * 2) + 1);
            sum(p * 2 + 1) += add(p) * (r(p * 2 + 1) - l(p * 2 + 1) + 1);
            add(p * 2) += add(p);
            add(p * 2 + 1) += add(p);
            add(p) = 0;
        }
    }
    
    void change(int p,int l,int r,int d) {
        if(l <= l(p) && r >= r(p)) {
            sum(p) += (ll) d * (r(p) - l(p) + 1);
            add(p) += d;
            return ;
        }
        spread(p);
        int mid = (l(p) + r(p)) / 2;
        if(l <= mid) change(p * 2,l,r,d);
        if(r > mid) change(p * 2 + 1,l,r,d);
        sum(p) = sum(p * 2) + sum(p * 2 + 1);
    }
    
    ll ask(int p,int l,int r) {
        if(l <= l(p) && r >= r(p)) return sum(p);
        spread(p);
        int mid = (l(p) + r(p)) / 2;
        ll val = 0;
        if(l <= mid) val += ask(p * 2,l,r);
        if(r > mid) val += ask(p * 2 + 1,l,r);
        return val;
    }
    
    int main() {
        n = read(); m = read();
        for(int i = 1; i <= n; ++i) a[i] = read();
        build(1,1,n);
        for(int i = 1; i <= m; ++i) {
            char op; int l,r,d;
            cin >> op; l = read(); r = read();
            if(op == 'C') {
                d = read();
                change(1,l,r,d);
            }
            else {
                write(ask(1,l,r));
                putchar('
    ');
            }
        }
        return 0;
    }
  • 相关阅读:
    MySQL数据库高并发优化配置
    MySQL性能参数详解
    jQuery中过滤选择器first和first-child的区别
    Linux非常用命令
    jps命令学习
    通过乐观锁(版本号)降低并发时的锁竞争
    ReentrantLock 相关学习笔记
    grep 所有多个关键字
    ThreadLocal学习笔记
    Idea设置全白色 背景
  • 原文地址:https://www.cnblogs.com/AK-ls/p/10612521.html
Copyright © 2011-2022 走看看