1 条题解
-
1
差分,因为区间的范围很大(),但实际的点数很少,因此要离散化一下,将所有的区间的端点存到一个数组里,去重排序一下,这样~的个点就离散化到了从~的个位置,因为排好序了,也不会出现交叉(大的离散化到小的,小的离散化到大的),每次对区间~,只需要二分查找到两个端点在数组中的下标和,然后给差分数组即可。
但事实上,不用这么麻烦,这题的难度远比原估计的要低,其实只需要用一个代替差分数组。观察可以发现,人数最多的那一段一定包含某一个区间的端点,所以只需要在上做差分,然后遍历所有的区间端点即可。
时间复杂度:
也可达到:
ACcode1
#include <iostream> #include <algorithm> #include <vector> #define endl '\n' using namespace std; typedef pair<int, int> PII; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector<PII> a(n); vector<int> v; for(int i = 0; i < n; i++){ int l, r; cin >> l >> r; a[i] = {l, r}; v.push_back(l), v.push_back(r); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); vector<int> d(v.size() + 2, 0); for(int i = 0; i < n; i++){ int l = lower_bound(v.begin(), v.end(), a[i].first) - v.begin(); int r = lower_bound(v.begin(), v.end(), a[i].second) - v.begin(); d[l]++, d[r + 1]--; } int res = d[0]; for(int i = 1; i < v.size(); i++){ d[i] += d[i - 1]; res = max(res, d[i]); } cout << res << endl; return 0; }
ACcode2
#include <iostream> #include <algorithm> #include <vector> #include <map> #define endl '\n' using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; map<int, int> d; for(int i = 0; i < n; i++){ int l, r; cin >> l >> r; d[l]++; d[r + 1]--; } int sum = 0, res = 0; for (auto [_, b] : d){ sum += b; res = max(res, sum); } cout << res << endl; return 0; }
- 1
信息
- ID
- 2276
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 149
- 已通过
- 14
- 上传者