#include <iostream>
#include<algorithm>
using namespace std;
int l, m;
struct ty
{
int pos=0, num=0;
}a[205];
bool comp(ty a, ty b)
{
return a.pos < b.pos;
}
int main()//离散化思想:离散化是指将无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
//在这个问题中,我们并不需要考虑线段上的每一个点,只需要关注区间的端点,因为区间覆盖的变化只发生在端点处。
// 通过将所有区间的端点提取出来并排序,我们可以把问题从一个连续的线段问题转化为一个离散的端点问题
{
cin >> l >> m;
for (int i = 1; i <= m; i++)//共有m个区间
{
int x, y;
cin >> x >> y;
a[i].pos = x;
a[i].num = 1;
a[i + m].pos = y +1; //在离开区间的那一刻减少计数
a[i + m].num = -1;
}
sort(a + 1, a + 2 * m + 1, comp);
int b = 0; int sum = 0;//b用来记录被覆盖的区间数量
for (int i = 1; i <= 2 * m; i++)
{
b += a[i].num;//第一个点特殊处理
if (b == 1 && a[i].num == 1)
{
sum += (a[i].pos - a[i - 1].pos);
//当 b 从 0 变为 1(即 b == 1 && a[i].num == 1)时,
//说明从无覆盖状态进入到有一个区间覆盖的状态,此时计算当前端点与前一个端点之间的距离,
// 即 a[i].pos - a[i - 1].pos,并累加到 sum 中,这就是一段未被覆盖的长度。
}
}
sum += (l - a[2 * m].pos + 1);
//遍历完所有端点后,还需要加上最后一个端点到线段末尾 l 的长度,
//即 l - a[2 * m].pos + 1,这也是未被覆盖部分的长度。
cout << sum;
return 0;
}
#include<algorithm>
using namespace std;
int l, m;
struct ty
{
int pos=0, num=0;
}a[205];
bool comp(ty a, ty b)
{
return a.pos < b.pos;
}
int main()//离散化思想:离散化是指将无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
//在这个问题中,我们并不需要考虑线段上的每一个点,只需要关注区间的端点,因为区间覆盖的变化只发生在端点处。
// 通过将所有区间的端点提取出来并排序,我们可以把问题从一个连续的线段问题转化为一个离散的端点问题
{
cin >> l >> m;
for (int i = 1; i <= m; i++)//共有m个区间
{
int x, y;
cin >> x >> y;
a[i].pos = x;
a[i].num = 1;
a[i + m].pos = y +1; //在离开区间的那一刻减少计数
a[i + m].num = -1;
}
sort(a + 1, a + 2 * m + 1, comp);
int b = 0; int sum = 0;//b用来记录被覆盖的区间数量
for (int i = 1; i <= 2 * m; i++)
{
b += a[i].num;//第一个点特殊处理
if (b == 1 && a[i].num == 1)
{
sum += (a[i].pos - a[i - 1].pos);
//当 b 从 0 变为 1(即 b == 1 && a[i].num == 1)时,
//说明从无覆盖状态进入到有一个区间覆盖的状态,此时计算当前端点与前一个端点之间的距离,
// 即 a[i].pos - a[i - 1].pos,并累加到 sum 中,这就是一段未被覆盖的长度。
}
}
sum += (l - a[2 * m].pos + 1);
//遍历完所有端点后,还需要加上最后一个端点到线段末尾 l 的长度,
//即 l - a[2 * m].pos + 1,这也是未被覆盖部分的长度。
cout << sum;
return 0;
}