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);
}
c++区间修改区间查询的树状数组
最新推荐文章于 2025-03-26 22:30:49 发布