#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
const int M=101000;
typedef struct{
int a;
int b;
}Point;
Point p[M];
long n,T;
bool cmp(Point x,Point y)
{
if(x.a==y.a)
{
return x.b>y.b;
}
else
{
return x.a<y.a;
}
}
priority_queue<long> q;
int main()
{
int flag=1;
long i,k,ans=0;
cin>>n>>T;
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
}
sort(p,p+n,cmp);
if(p[0].a!=1) //没有能盖到1的区间
{
flag=0;
}
else
{
int index=0,end=0,cur; //当前已经cover: 1~end
while(end<T)
{
int cur=end+1;// 题目坑 可以(1,3) (4,6)
for(i=index;i<n;i++)
{
if(p[i].a<=cur) //中间不能有空隙
{
end=max(end,p[i].b); // 找到(左端点小于等于cur)&&右端点最大的进行cover
}
else // 上一头牛的左端点为最远点了 (中间不能有空隙 )
{
index=i;
break;
}
}
if(cur>end) // 最大右端点 小于cur
{
flag=0;
break;
}
else
{
ans++;
}
}
}
if(flag)
{
cout<<ans<<endl;
}
else
{
cout<<-1<<endl;
}
return 0;
}
poj 2376 贪心(区间覆盖)
最新推荐文章于 2019-07-27 20:04:27 发布