题目描述
题目背景
你是能看见第3题的friends哦 ——taoyc
题目描述
JC内长度为L的马路上有一些值周同学,每两个相邻的同学之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…L,都有一个值周同学。 由于水宝宝有用一些区间来和ssy搞事情,所以为了避免这种事走漏风声,水宝宝要踹走一些区域的人。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的人(包括区域端点处的两个人)赶走。你的任务是计算将这些人都赶走后,马路上还有多少个人。
输入描述:
第一行有2个整数L和M,L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。 接下来的M行每行包含2个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标
输出描述:
1个整数,表示马路上剩余的人的数目。
示例1
输入
500 3 150 300 100 200 470 471
输出
298
说明
对于所有的数据,1≤L≤100000000 对于10%的数据,1<=M<=100 对于20%的数据,1<=M<=1000 对于50%的数据,1<=M<=100000 对于100%的数据,1<=M<=1000000
思路
离散化,按照区间左端点升序,若一致则右端点升序。用pair很舒服不需要写很多结构体还有比较函数什么的。随后就是区间分析了,由于按照左端点升序了,所以第二个区间只有三种情况,第一在第一个区间内部,无效。第二与第一个区间部分重叠,那就加上多出了的那一段。第三与第一个区间相离,那就直接加上就好了。这里需要维护一个尾指针,然后sum统计走掉的人数。最后注意题目的范围是0-l,有l+1个人。
代码
//值周(离散化 区间覆盖) #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N = 1e6 + 10; pair<int , int> s[N]; int main() { int l , m; scanf("%d %d" , &l , &m); int x , y; for(int i = 0 ; i < m ; i++) { scanf("%d %d" , &x , &y); s[i] = make_pair(x , y); } sort(s , s + m); int sum = s[0].second - s[0].first + 1 , end = s[0].second; for(int i = 1 ; i < m ; i++) { if(s[i].first > end) { sum += s[i].second - s[i].first + 1; end = s[i].second; } else if(s[i].second >= end) { sum += s[i].second - end; end = s[i].second; } } printf("%d\n" , l - sum + 1); return 0; }