zoukankan      html  css  js  c++  java
  • 洛谷P3368树状模板(区间更新+单点查询+差分)

    题目链接:https://www.luogu.org/problem/P3368

    思路:区间更新的时候用到差分的思想

    在区间[1,5]里给[2,4]区间加上2,在位置2加上2,位置5加上-2,[1,5]变成(0,2,0,0,0,-2),当查询位置3的值时

    ll getsum(ll x) {
        ll ans = 0;
        for(int i = x; i > 0; i -= lowbit(i)) {
            ans += c[i];
        }
        return ans;
    }

    完整代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define mem(a,b) memset(a,b,sizeof(a));
    using namespace std;
    typedef long long ll;
    const int maxn = 500005;
    const ll INF = 0x3f3f3f3f;
    int n,m;
    ll c[maxn],a[maxn];
    ll lowbit(ll t) {//取出t的最低位1
        return t&(-t);
    }
    ll getsum(ll x) {
        ll ans = 0;
        for(int i = x; i > 0; i -= lowbit(i)) {
            ans += c[i];
        }
        return ans;
    }
    void update(ll x,ll v) {
        for(int i = x; i <= n; i+=lowbit(i)) {
            c[i] += v;
        }
    }
    int main()
    {
    
        cin >> n >> m;
        for(int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        int op;
        ll x,y,z;
        for(int i = 1; i <= m; i++) {
            cin >> op;
            if(op == 1) {
                cin >> x >> y >> z;
                update(x,z);
                update(y+1,-z);
            }
            else {
                cin >> y;
                cout << a[y] + getsum(y) << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    最小生成树算法
    并查集
    背包问题
    木桶排序
    STL之vector
    STL中的queue用法与stack用法对比
    快速幂求模
    归并排序+典型例题(逆序对)
    负进制转换
    冒泡排序
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11341165.html
Copyright © 2011-2022 走看看