题目描述

题目背景

你是能看见第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;
}