这题应该就是离散化模板题了
首先我们先把所有坐标离散化,然后用类似扫描线的思想,把几个线段交叉起来的分成一小段一小段,然后求和。然后怎么判断我们需不需要继续求和呢?(就是每一长段有没有间隔)那就利用前缀和的思想,在起点+1,终点-1,这样就可以了,剩下的就是写代码了
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[20005],b[20005],c[40010],add[40010],cnt,num,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i],&b[i]);
c[++cnt]=a[i];
c[++cnt]=b[i];
}
sort(c+1,c+cnt+1);
int len=unique(c+1,c+cnt+1)-(c+1);
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(c+1,c+cnt+1,a[i])-c;
b[i]=lower_bound(c+1,c+cnt+1,b[i])-c;
add[a[i]]++;
add[b[i]]--;
}
for(int i=1;i<=cnt;i++)
{
num+=add[i];
if(num>0)
{
ans+=c[i+1]-c[i];
}
}
cout<<ans;
}