c++区间修改区间查询的树状数组

using namespace std;
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <utility>
#include <map>
#include <vector>
#include <numeric>
#include <iostream>

using namespace std;


auto _ = []() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}();

using namespace std;
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <utility>
#include <map>
#include <vector>
#include <numeric>
#include <iostream>
#include <cstring>

using namespace std;

#define ll long long
const int MAX_N = 1e5 + 7;
ll sum1[MAX_N];
ll sum2[MAX_N];
ll n;

void add(ll i, ll v) {
    while (i <= n) {
        sum1[i] += v;
        sum2[i] += i * v;
        i += (i & -i);
    }
}

void add(ll l, ll r, ll v) {
    if (l == r) {
        add(l, v);
        return;
    }
    add(l, v);
    add(r + 1, -v);
}

ll sum(ll i) {
    ll res = 0;
    while (i > 0) {
        res += (i + 1) * sum1[i] - sum2[i];
        i &= (i - 1);
    }
    return res;
}

ll sum(int l, int r) {
    return sum(r) - sum(l - 1);
}


class Solution {
public:
    int findMinimumTime(vector<vector<int>>& tasks) {
        int ans = 0;
        ranges::sort(tasks, {}, [&](const vector<int>& lhs) {
            return lhs[1];
        });
        n = tasks.back()[1] + 1;
        memset(sum1, 0, sizeof(sum1));
        memset(sum2, 0, sizeof(sum2));

        for (auto & vec : tasks) {
            int st = vec[0], et = vec[1], d = vec[2];
            int used = sum(st, et);
            if (used >= d) {
                continue;
            }
            int s = et;
            ans += d - used;
            for (int i = 0; i < d - used; i++) {
                while (s >= st and sum(s, s) == 1) s--;
                if (s >= st) add(s, 1);
            }
        }
        return ans;
    }
};

int main() {
    vector<vector<int>> t = {{2,3,1},{4,5,1},{1,5,2}};
    cout << Solution{}.findMinimumTime(t);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值