2636 - 白云校区的树
在白云校区门口到大马路总共有一条长L米的小路,小路旁边有一排树,两棵相邻树之间的间隔都是2米,可以把马路看成一条直线,白云校区门口看成0点,大马路口在L位置,则在直线上0, 2, 4, 6, 8, 10, … 上都种了一棵树, 如果L是偶数,则在L处也有棵树, 否则没有树。
现在马路上需要用一些区域来修建公交车站,这些区域用它们在直线上的起始点与终止点表示,已知任一区域的起始点和终止点的坐标都是整数,公交站区域之间可能有重合的部分,现在要把这些区域中的树(包括区域端点处的两棵树,如果有树的话)移走。请你计算将这些树移走后马路上还剩下多少棵树。
<span style="color:#E53333;">(大家注意落在重复的区域的树不要重复计数,这道题很简单,千万不要想复杂,注意边界值,下面增加2组测试数据</span><span style="color:#E53333;">)</span>
Input
有多组测试数据(小于1000组),每组测试数组的第一行有两个整数L(1≤L≤10 000)和M(1≤M≤100), L表示马路的长度,M表示区域的个数。接下来M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起点与终点的坐标。
Output
每组数据的输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
Examples
Input
500 3 150 300 100 200 470 471 1000 3 150 400 100 300 470 571 9021 7 2678 5641 1497 3088 8369 8436 3105 5119 2759 5024 5449 6408 4754 4843 100 2 0 100 50 60
Output
149 299 2021 0
Solution C++
#include<iostream> #include <algorithm> using namespace std; const int NN = 10001; void Process(bool trees[], int start, int end) { for (int i=start; i<=end; i++) trees[i] = false; } int main() { int L, M, i; bool trees[NN]; int start, end; while(cin>>L >>M) { for (i=0; i <= L; i++) { if (i%2 == 0) trees[i] = true; else trees[i] = false; } for (i=0; i<M; i++) { cin>>start >>end; Process(trees, start, end); } cout<<count(trees, trees+L+1, true)<<endl; } return 0; }