1 条题解
-
0
差分,双指针。
用差分维护覆盖次数,即: 表示区间 都被覆盖一次。
数据范围较大,使用 即可。
因为数据范围较大,无法直接遍历整个的长度求答案。但是你会发现,这个总的有效区间其实是被分成了两种种类,分别为只被覆盖一次连续区间,被覆盖两次及以上的连续区间。没被覆盖的不考虑。所求为被覆盖两次及以上的区间的最长长度。
考虑使用双指针,遍历插入的位置。
思考答案是如何更新的。当 遍历到一个位置,这个位置的覆盖次数 这个时候可以更新答案(按差分的定义一定会存在这样的位置),意味着我们重新寻找下一个区间。 的更新是在从次数 的位置变为次数 的位置。
#include <bits/stdc++.h> using i64 = long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; std::map<i64, int> map; for (int i = 0; i < n; ++i) { i64 l, r; std::cin >> l >> r; ++map[l]; --map[r + 1]; } i64 ans = 0, l = 1E18, cur = 0; for (auto [r, j]: map) { cur += j; if (cur > 1) { l = std::min(l, r); } else { ans = std::max(ans, r - l); l = 1E18; } } std::cout << ans; return 0; }
- 1
信息
- ID
- 42
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 88
- 已通过
- 16
- 上传者