演算法訓練 演算法提高(VIP) 校門外的樹

2021-10-08 14:25:44 字數 1641 閱讀 2790

問題描述

某校大門外長度為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,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...