题目链接:题目
大意:
有若干项任务,都会占用连续的时间,兄弟和妈妈分别会来 d d d天,兄弟来的时候任务要多,妈妈则相反。
思路:
(这是jiangly的思路和代码)
也就是求每一段时间内共经历了多少种任务。分别求出边界
r
r
r的数量的前缀和及
l
l
l的数量的后缀和,因为我们要仅通过
i
i
i和
i
+
d
i+d
i+d来得到在左边结束的和在右边开始的,因为这些区间是绝对不会覆盖我们想要找的区间的,而剩下的区间要么在我们所求的区间开始,要么在这结束,就是我们要找的。
代码:
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
int n, d, k;
std::cin >> n >> d >> k;
std::vector<int> L(n + 1), R(n + 1);
for (int i = 0; i < k; i++) {
int l, r;
std::cin >> l >> r;
l--;
L[l]++;
R[r]++;
}
for (int i = 1; i <= n; i++) {
R[i] += R[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
L[i] += L[i + 1];
}
int mx = -1;
int imx = -1;
int mn = n + 1;
int imn = -1;
std::vector<int> a(n + 1);
for (int i = 0; i <= n - d; i++) {
int v = R[i] + L[i + d];
a[i] = v;
if (v > mx) {
mx = v;
imx = i + 1;
}
if (v < mn) {
mn = v;
imn = i + 1;
}
}
std::cout << imn << " " << imx << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}