区间覆盖问题

题目描述

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

输入格式

第一行\(n(n \le 1000000)\)

之后\(n\)行,每行两个数分别为\(a_i,b_i\)

最后一行为\(s\)\(t\)

输出格式

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

样例

样例输入1

3
1 3
2 4
3 5
2 2

样例输出1

1

数据范围

对于\(20\%\)的数据,\(n≤10\)

对于\(50\%\)的数据,\(n≤1000\)

对于\(70\%\)的数据,\(n≤100000\)

对于\(100\%\)的数据,\(n≤1000000,0≤ai<bi≤1000000\)

代码

#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 @ 2023-07-01 08:52  Momo·Trace  阅读(35)  评论(0编辑  收藏  举报