题目描述
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入描述:
两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。
输出描述:
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
示例1
输入
500 3
100 200
150 300
470 471
输出
298

解题思路:我开始以为是排序,然后把重合的部分拼接起来,最后用总的长度减去所占有效区间的长度。可想而知,麻烦的要死。然后看了一下书发现这个题可以用哈希,然后愉快的解决了。
注意点:所以方法很重要,骚想法并没有什么卵用。0要考虑在内。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
    int L,M;
    int Hash[10005];
    while(scanf("%d%d",&L,&M) != EOF){
        memset(Hash,0,sizeof(Hash));
        int from,to;
        for(int i = 0;i < M;i++){
            scanf("%d%d",&from,&to);
            for(int j = from;j <= to;j++){
                Hash[j]++;
            }
        } 
        int ans=0;
        for(int i = 0;i <= L;i++){
            if(Hash[i] == 0){
                ans++;
            }
        }
        printf("%d\n",ans);     
    }
    return 0;
}