题目链接:题目
大意:
有若干项任务,都会占用连续的时间,兄弟和妈妈分别会来 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;
}