我看题解都是用map或者set然后分类讨论,那我发一个使用二分加前缀和的思路。我们可以离线把操作记录下来然后二分最少需要几次可以全部覆盖。每次二分我们可以把前mid次操作通过差分和前缀和完成。具体可以看代码
#include<bits/stdc++.h>
using i64 = long long;
void DAOQI() {
int n, m;
std::cin >> n >> m;
std::vector<int> p(n + 2);
std::vector<std::pair<int, int>> Q(m + 1);
for (int i = 1; i <= m; i++) std::cin >> Q[i].first >> Q[i].second;
auto check = [&](int mid) {
std::fill(p.begin(), p.end(), 0);
for (int i = 1; i <= mid; i++) {
auto [op, x] = Q[i];
if (op == 1) {
p[x]++, p[x + 1]--;
} else {
if (x > 1) p[1]++, p[x]--;
if (x < n) p[x + 1]++;
}
}
for (int i = 1; i <= n; i++) {
p[i] += p[i - 1];
if (p[i] == 0) return false;
}
return true;
};
int l = 1, r = m, ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int T = 1;
//std::cin >> T;
while (T--) DAOQI();
return 0;
}

京公网安备 11010502036488号