The unive|

Momo·Trace

园龄:3年3个月粉丝:6关注:1

区间覆盖问题

题目描述

数轴上有n个闭区间[ai,bi],选取尽量少的区间覆盖一条指定线段[s,t]

输入格式

第一行nn1000000

之后n行,每行两个数分别为aibi

最后一行为st

输出格式

最少需要选择的区间个数,如果无解则输出no solution!

样例

样例输入1

3
1 3
2 4
3 5
2 2

样例输出1

1

数据范围

对于20%的数据,n10

对于50%的数据,n1000

对于70%的数据,n100000

对于100%的数据,n10000000aibi1000000

代码

#include <bits/stdc++.h>
using namespace std;
struct node{
int l,r;
}a[1000005];
bool cmp(node x,node y)
{
return x.l<y.l;
}
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i].l >> a[i].r;
}
int s,t;
cin >> s >> t;
sort(a+1,a+n+1,cmp);
int ans=0;
int last=s;//当前的能向右扩展的最右方
int maxx=-1;
for(int i=1;i<=n;i++)
{
if(a[i].l>last)
{
//所有左端点在last左边的区间已经处理完了
if(maxx<=last) break;
ans++;
last=maxx;
maxx=-1;
if(last>=t) break;
}
if(a[i].l<=last && a[i].r>maxx)
{//更新右端点的最大值
maxx=a[i].r;
}
}
if(last<t && maxx>last)
{
last=maxx;
ans++;
}
if(last<t)
{
cout << "no solution!";
}
else{
cout << ans;
}
return 0;
}
posted @   Momo·Trace  阅读(36)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示