Appearance
除“区间求并”一节另有说明外,本文均讨论闭区间
选最少的点覆盖所有区间
点击展开代码
cpp
int calc(vector<pii> a) {
sort(a.begin(), a.end(), [&](pii x, pii y) -> bool {
return x.second == y.second ? x.first < y.first : x.second < y.second;
});
int res = 0, r = 0;
bool has = false;
for (auto u : a) {
if (!has || u.first > r) {
res++;
r = u.second;
has = true;
}
}
return res;
}选最多的区间互不相交
同【选最少的点覆盖所有区间】。
区间分成组内区间无交的最少组数
点击展开代码
cpp
int calc(vector<pii> a) {
sort(a.begin(), a.end());
priority_queue<int, vector<int>, greater<int>> q;
for (auto [l, r] : a) {
if (q.size() && q.top() < l)
q.pop();
q.push(r);
}
return q.size();
}选最少的区间覆盖整段区间
这里覆盖的是从
点击展开代码
cpp
int calc(int s, int t, vector<pii> a) {
if (s >= t)
return 0;
sort(a.begin(), a.end());
int res = 0, cur = s, i = 0;
while (cur < t) {
int r = cur;
while (i < a.size() && a[i].first <= cur) {
r = max(r, a[i].second);
i++;
}
if (r <= cur)
return -1;
cur = r;
res++;
}
return res;
}区间求并
本节单独约定输入为闭整数区间,返回其并集中整数点的数量,因此每个合并后区间
点击展开代码
cpp
long long calc(vector<pii> a) {
if (a.empty())
return 0;
sort(a.begin(), a.end());
long long res = 0, l = a[0].first, r = a[0].second;
for (int i = 1; i < a.size(); i++) {
auto u = a[i];
if (u.first <= r + 1) {
r = max(r, 1ll * u.second);
} else {
res += r - l + 1;
l = u.first;
r = u.second;
}
}
res += r - l + 1;
return res;
}