本题是一道区间问题,很容易想到贪心的方法,将区间左端点l排序,然后从左到右维护,R表示已经贪心到的最右端的边界,如果当前的右边界大于等于R就加上不重复覆盖的区间长度,同时更新R。完整代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n;
struct qj{
ll l,r;
}a[N];
bool cmp(qj q1,qj q2){
if(q1.l!=q2.l) return q1.l<q2.l;
return q1.r<q2.r;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
}
sort(a+1,a+1+n,cmp);
ll R=0,ans=0;
for(int i=1;i<=n;i++){
if(R<=a[i].r){
ans+=a[i].r-max(a[i].l,R)+1;
}
R=a[i].r+1;
}
printf("%lld",ans);
return 0;
}