zoukankan      html  css  js  c++  java
  • [wikioi]线段树练习

    http://codevs.cn/problem/1080/

    #include <vector>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    const int MAXN = 100000;
    
    struct Line {
        int left, right;
        int n;
    };
    
    Line tree[MAXN * 3];
    
    void buildtr(int left, int right, int k) {
        tree[k].left = left;
        tree[k].right = right;
        tree[k].n = 0;
        if (left == right) return;
        int mid = (left + right) / 2;
        buildtr(left, mid, k * 2);
        buildtr(mid + 1, right, k * 2 + 1);
    }
    
    int query(int x, int k) {
        if (tree[k].left == x && tree[k].right == x) {
            return tree[k].n;
        }
        int mid = (tree[k].left + tree[k].right) / 2;
        if (x <= mid) return query(x, k * 2);
        else return query(x, k * 2 + 1);
    }
    
    int query(int l, int r, int k) {
        if (tree[k].left == l && tree[k].right == r) {
            //cout << "k:" << k << ",l" << l << "r," << r << ",n:" << tree[k].n << endl;
            return tree[k].n;
        }
        int mid = (tree[k].left + tree[k].right) / 2;
        if (r <= mid) {
            return query(l, r, k * 2);
        } else if (l > mid) {
            return query(l, r, k * 2 + 1);
        } else {
            return query(l, mid, k * 2) + query(mid + 1, r, k * 2 + 1);
        }
    }
    
    int update(int x, int y, int k) {
        int diff = 0;
        if (tree[k].left == x && tree[k].right == x) {
            diff = y - tree[k].n;
            tree[k].n = y;
            return diff;
        }
        int mid = (tree[k].left + tree[k].right) / 2;
        if (x <= mid) {
            diff = update(x, y, k * 2);
        } else {
            diff = update(x, y, k * 2 + 1);
        }
        tree[k].n += diff;
        return diff;
    }
    
    int add(int l, int r, int x, int k) {
        int diff = 0;
        if (tree[k].left == tree[k].right) {
            diff = x;
            tree[k].n += x;
            //cout << "diff:" << x << endl;
            return x;
        }
        int mid = (tree[k].left + tree[k].right) / 2;
        if (mid >= r) {
            diff = add(l, r, x, k * 2);
        } else if (mid < l) {
            diff = add(l, r, x, k * 2 + 1);
        } else {
            diff += add(l, mid, x, k * 2);
            diff += add(mid + 1, r, x, k * 2 + 1);
        }
        tree[k].n += diff;
        return diff;
    }
    
    int main() {
        int n;
        cin >> n;
        memset(tree, sizeof(tree), 0);
        buildtr(1, n, 1);
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            update(i, x, 1);
        }
        int m;
        cin >> m;
        while (m--) {
            int c, x, y;
            cin >> c >> x >> y;
            if (c == 1) {
                add(x, x, y, 1);
            } else if (c == 2) {
                int res = query(x, y, 1);
                cout << res << endl;
            }
        }
    }
    

      

  • 相关阅读:
    行盒(line box)垂直方向的属性详解:从font-size、line-height到vertical-align
    CSS绝对定位的原点:是在border上、padding上还是在content上?
    从知乎首页用户操作入口学习到的CSS技巧
    重置表单中的文件上传控件(file input)的方法
    ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记
    Yarn的Linking dependencies特别慢的优化方法
    MongoDB学习记录(四)
    MongoDB学习记录(三)
    MongoDB学习记录(二)
    AdBlock——拦截网页广告
  • 原文地址:https://www.cnblogs.com/lautsie/p/4034372.html
Copyright © 2011-2022 走看看