P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
#define lint long long
lint n,ans=0,add=0;
lint c[40100]={0}; //数组c离散化储存原来的坐标
int a[20100],b[20100],flag[40100]={0};
int find(int num){ //二分查找
int l=1,r=add;
while(l<=r){
int mid=(l+r)/2;
if (c[mid]>num) r=mid-1;
else if(c[mid]<num) l=mid+1;
else return mid;
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
add++;
c[add]=a[i];
add++;
c[add]=b[i];
}
sort(c+1,c+add+1);
for(int i=1;i<=n;i++){
a[i]=find(a[i]); //查找在c中的储存坐标
b[i]=find(b[i])-1;
for(int j=a[i];j<=b[i];j++) flag[j]=1;
}
for(int i=1;i<=add;i++){
if(flag[i])
ans+=c[i+1]-c[i];
}
cout << ans;
}