题意
给出nnn段区间和mmm个点,每个区间可以和在它范围内的点匹配,求出最大匹配数。
思路
看起来像最大匹配,但是复杂度不可观。
正解为贪心。当一个点被多个区间覆盖时,选右端点最小的区间匹配。因为右端点更大的有可能点能匹配。
利用堆来处理即可。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
struct node {
int l, r;
}a[200001];
std::priority_queue<int> q;
int n, m, ans;
int p[200001], v[200001];
bool operator <(const node &a, const node &b) {
return a.l < b.l;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d %d", &a[i].l, &a[i].r);
for (int i = 1; i <= m; i++)
scanf("%d", &p[i]);
std::sort(a + 1, a + n + 1);
std::sort(p + 1, p + m + 1);
for (int i = 1, tail = 1; i <= m; i++) {
while (tail <= n && a[tail].l <= p[i]) q.push(-a[tail++].r);
while (q.size() && -q.top() < p[i]) q.pop();
if (q.size()) q.pop(), ans++;
}
printf("%d", ans);
}