题解: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;
}
posted @ 2024-10-02 18:56  cly312  阅读(66)  评论(0)    收藏  举报