The road off the east gate of Peking University used to be decorated with a lot of trees. However, because of the construction of a subway, a lot of them are cut down or moved away. Now please help to count how many trees are left.
Let‘s only consider one side of the road. Assume that trees were
planted every 1m (meter) from the beginning of the road. Now some
sections of the road are assigned for subway station, crossover or other
buildings, so trees in those sections will be moved away or cut down.
Your job is to give the number of trees left.
For example, the road is 300m long and trees are planted every 1m
from the beginning of the road (0m). That‘s to say that there used to be
301 trees on the road. Now the section from 100m to 200m is assigned
for subway station, so 101 trees need to be moved away and only 200
trees are left.
There
are several test cases in the input. Each case starts with an integer L
(1 <= L < 2000000000) representing the length of the road and M
(1 <= M <= 5000) representing the number of sections that are
assigned for other use.
The following M lines each describes a section. A line is in such format:
Start End
Here Start and End (0 <= Start <= End <= L) are both
non-negative integers representing the start point and the end point of
the section. It is confirmed that these sections do not overlap with
each other.
A case with L = 0 and M = 0 ends the input.
Output the number of trees left in one line for each test case.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define REP(i, s, n) for(int i = s; i <= n; i ++)
#define REP_(i, s, n) for(int i = n; i >= s; i --)
#define MAX_N 5000 + 10
using namespace std;
int n, L;
int a[MAX_N], b[MAX_N];
int main(){
while(scanf("%d%d", &L, &n) != EOF){
if(L == 0 && n == 0) break;
REP(i, 1, n) scanf("%d%d", &a[i], &b[i]);
sort(a + 1, a + n + 1); sort(b + 1, b + n + 1);
L ++;
int node = 1, l = a[1], r = b[1], sum = 0;
while(node < n){
if(a[node + 1] <= b[node]) node ++, r = b[node];
else{
sum += r - l + 1;
node ++; l = a[node]; r = b[node];
}
}
sum += r - l + 1;
printf("%d\n", L - sum);
}
return 0;
}