注意点1:
记得先a[1]的值初始化,再循环。
易错点2:
如果区间重复,记得更新右端点的值。可能原来的区间的右端点更大,也有可能合并的区间的右端点更大。我们使用一个max,保留最大的那一个。
易错点3:
最后一次循环会直接断掉,我们不要忘记++手动加上++最后一段合并区间的长度!
代码:
cpp
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2e4 + 10;
LL n;
struct node
{
LL l;
LL r;
}a[N];
bool cmp(node& x, node& y)
{
return x.l < y.l;
}
LL ret = 0;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i].l >> a[i].r;
sort(a+1, a+1+n, cmp);
LL begin = a[1].l;
LL right = a[1].r;
for (int i = 2; i <= n; i++)
{
if (right >= a[i].l)
{
right = max(right, a[i].r);
continue;
}
else
{
ret += a[i-1].r-begin;
begin = a[i].l;
right = a[i].r;
}
}
ret += right - begin; // 加上最后一个合并区间的长度
cout << ret << endl;
return 0;
}
记得多画图