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 = -inf;
for (auto u : a) {
res += (u.first > r);
r = (u.first > r) ? u.second : r;
}
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) {
sort(a.begin(), a.end());
int res = 1, r = -inf;
for (auto u : a) {
if (u.first <= s) {
r = max(r, u.second);
} else {
if (u.first > r) // 注意边界取等还是 +1
return -1;
res++;
s = r;
r = max(r, u.second);
}
if (r >= t)
return res;
}
return -1;
}区间求并
cpp
int calc(vector<pii> a) {
sort(a.begin(), a.end());
int res = 0, l = -inf + 1, r = -inf;
for (auto u : a) {
if (u.first <= r) {
r = max(r, u.second);
} else {
res += r - l + 1;
tie(l, r) = u;
}
}
res += r - l + 1;
return res;
}