这道题是一道经典的离散化题(当然可以暴力/线段树)。
我们首先对输入的
l
l
l和
r
r
r进行离散化,然后排序。
再枚举每段离散后的区间,如果属于可修地铁的地方就用马路总长减去此区间
+
1
+1
+1
注意重复的边界。
注意输出加一(0也算)。
具体:
看代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int s,n,l[10010],r[10010];
int lsh[10010];
int main()
{
cin>>s>>n;
for(int i=1; i<=n; i++)
{
cin>>l[i]>>r[i];
lsh[i]=r[i]; //离散化
lsh[i+n]=l[i];
}
int b=-1;
sort(lsh+1,lsh+1+2*n);
for(int i=2; i<=2*n; i++)
for(int j=1; j<=n; j++)
{
if(lsh[i]>l[j]&&lsh[i]<=r[j]) //判断是否属于可修地铁的地方
{
s=s-(lsh[i]-lsh[i-1])-1;
if(lsh[i-1]==b)
s++;
b=lsh[i];
break;
}
}
cout<<s+1;
return 0;
}