题解:CF2014D Robert Hood and Mrs Hood
差分,每次差分将 \(\max(1,l-d+1)\) 加 \(1\),将 \(r+1\) 位置减 \(1\)。
然后前缀和求原数组,再遍历一下求最小值和最大值即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, d, k;
cin >> n >> d >> k;
vector<int> cover(n + 2, 0);
for (int i = 0; i < k; ++i) {
int l, r;
cin >> l >> r;
cover[max(1,l-d+1)]++;
cover[r + 1]--;
}
for (int i = 1; i <= n; ++i) {
cover[i] += cover[i - 1];
}
int bday = 1, mday = 1;
int maxn = -1, minn = INT_MAX;
for (int day = 1; day <= n - d + 1; ++day) {
if (cover[day] > maxn) {
maxn = cover[day];
bday = day;
}
if (cover[day] < minn) {
minn = cover[day];
mday = day;
}
}
cout << bday << ' ' << mday << '\n';
}
return 0;
}

浙公网安备 33010602011771号