AcWing 907. 区间覆盖
原题链接
简单
作者:
跟着灿哥学切菜
,
2021-01-20 11:37:50
,
所有人可见
,
阅读 249
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l, r;
bool operator< (const Range &W)const
{
return l < W.l;
}
}range[N];
int main()
{
int st, ed;
scanf("%d%d", &st, &ed);
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
{
int l, r;
scanf("%d%d", &l, &r);
range[i] = {l, r};
}
sort(range, range + n);
int res = 0;
bool success = false;
//从前往后来考虑每一个区间。
for (int i = 0; i < n; i ++ )
{
//使用双指针算法来扫描一遍
//r表示当前的最大值
int j = i, r = -2e9;
//遍历所有左端点在st的左边的区间的右端点最大的区间
while (j < n && range[j].l <= st)
{
r = max(r, range[j].r);
j ++ ;
}
//如果此时最大值都是小于start, 此时无解
if (r < st)
{
res = -1;
break;
}
//此时加上这个区间的数量1
res ++ ;
//如果此时的右端点已经大于ed, 此时表示整个过程已经结束了。
if (r >= ed)
{
success = true;
break;
}
//如果此时没有结束, 此时将此时的右端点赋值为下一次遍历的左端点,为下一次查找做准备
st = r;
i = j - 1;
}
if (!success) res = -1;
printf("%d\n", res);
return 0;
}