問題描述
某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。
我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置;
數軸上的每個整數點,即0,1,2,……,l,都種有一棵樹。
由於馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。
已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。
現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。
你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
輸入格式
輸入檔案的第一行有兩個整數 l 和 m,l 代表馬路的長度,m 代表區域的數目,l 和 m 之間用乙個空格隔開。
接下來的 m 行每行包含兩個不同的整數,用乙個空格隔開,表示乙個區域的起始點和終止點的座標。
輸出格式
輸出檔案包括一行,這一行只包含乙個整數,表示馬路上剩餘的樹的數目。
樣例輸入
500 3
150 300
100 200
470 471
樣例輸出
298資料範圍
1 ≤ l ≤ 10000,
1 ≤ m ≤ 100
題解一
刷陣列 o(n*m):
每砍一棵樹,就打個標記,最後統計沒打標記的位置。
#include
using
namespace std;
const
int n =
10010
;bool s[n]
;int
main()
int ans =0;
for(
int i =
0; i <= n; i ++)if
(!s[i]
) ans ++
;
cout << ans << endl;
return0;
}
題解二
區間合併 (m*logm):
#include
#include
#define x first
#define y second
using
namespace std;
typedef pair<
int,
int> pii;
const
int n =
110;
pii q[n]
;int
main()
else r =
max(r, q[i]
.y);
ans +
= r - l +1;
cout << n +
1- ans << endl;
return0;
}
13年演算法訓練裡更新的題目,15年在演算法提高中又更新了一遍? 演算法提高 校門外的樹
問題描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...
演算法提高 校門外的樹
問題描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...
演算法提高 校門外的樹
問題描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...