思路:区间问题,按照左端点从小到大排序,将可以合并的区间合并更新右端点在更新移除人数,将不可以合并的区间求差与原先人数相加在更新左右端点,最后总人数减移除人数加1,从零开始。由于排序之后,后一个的左端点肯定大于等于前一个,所以最先让比较的左右端点等于最开始的左右端点,再根据每次比较的右端点与此次的左右端点比较可以判断区间是否可以合并。具体代码如下
#include <iostream>
#include <algorithm>
using namespace std;
struct p
{
long long a;
long long b;
};
struct p w[1000010];
bool cmp(struct p x,struct p y)
{
return x.a<y.a;
}
int main()
{
long long L,m;
cin>>L>>m;
long long ans=0;
for(int i=0;i<m;i++)
{
cin>>w[i].a>>w[i].b;
}
sort(w,w+m,cmp);
ans=w[0].b-w[0].a+1;
long long l=w[0].a,r=w[0].b;
for(int i=1;i<m;i++)
{
if(r<w[i].a)
{
ans+=w[i].b-w[i].a+1;
l=w[i].a,r=w[i].b;
}
else if(r>=w[i].a&&r<w[i].b)
{
ans=w[i].b-l+1;
r=w[i].b;
}
else
{
ans=ans;
}
}
cout<<L-ans+1;
return 0;
}