这道题是一道经典的离散化题(当然可以暴力/线段树)。
我们首先对输入的
和
进行离散化,然后排序。
再枚举每段离散后的区间,如果属于可修地铁的地方就用马路总长减去此区间
注意重复的边界。
注意输出加一(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;
}