正题
题目大意
nnn个区间mmm个点,一个区间只能匹配一个点,求最大匹配数。
解题思路
我们可以先将点排序,和区间按照左端点排序。然后从左往右枚举点,遇到一个区间的左端点就加入这样我们就可以忽略区间的左端点了,然后遇到右端点就弹出该区间。
然后我们就每次都选出了可以匹配的区间,然后在可以匹配的区间中我们选择右端点最靠左的区间匹配。
为什么这是最优的,因为在左边的已经不用管了,所以在一堆右端点中肯定是更左的是更优的
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=200100;
struct node{int l,r;
}a[N];
int n,m,t[N],ans;
priority_queue<int> q;
bool cmp(node x,node y)
{return x.l==y.l?x.r<y.r:x.l<y.l;}
int main()
{//freopen("dream.in","r",stdin);//freopen("dream.out","w",stdout);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",&t[i]);sort(t+1,t+1+m);sort(a+1,a+1+n,cmp);int tail=1;for(int i=1;i<=m;i++){while(tail<=n&&a[tail].l<=t[i])q.push(-a[tail++].r);while(!q.empty()&&-q.top()<t[i]) q.pop();if(!q.empty())ans++,q.pop();}printf("%d",ans);
}