P1047 校門外的樹 題解

2022-09-16 20:30:25 字數 1058 閱讀 9851

題目鏈結

這個題比較簡單,怎麼做都行,但是看洛谷後面題解感覺還是有點複雜了,所以隨手寫一寫題解。

題目描述

某校大門外長度為 \(l\)​的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 11 公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0 的位置,另一端在$ l $​​的位置;數軸上的每個整數點,即 \(0,1,2,\dots,l\)​都種有一棵樹。

由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。

輸入格式

第一行有兩個整數,分別表示馬路的長度 $l $ 和區域的數目 m

接下來 m 行,每行兩個整數 u, v,表示乙個區域的起始點和終止點的座標。

輸出格式

輸出一行乙個整數,表示將這些樹都移走後,馬路上剩餘的樹木數量。

思路最簡單的是開乙個陣列,先種樹再拔樹,模擬。

然後這個題也可以用線段樹。

後面還有用珂朵莉樹的(沒學過,不會)。

實際上這個題只需要遍歷長度為\(l\)​的陣列一遍,複雜度\(o(l)\)​​。首先通過陣列mp,在每個區域起始位置,記錄下該區域的終點位置,也可以看成是在起始位置處打上了標記。在遍歷陣列時,用乙個遍歷suo維護當前被砍掉的樹最遠在哪。在沒遇到標記時,樹一定沒有被砍。在遇到標記後,開始更新變數suo,如果當前位置小於suo則樹一定被砍了,反之沒有被砍。因此一層迴圈遍歷就能數出剩餘樹木的數量。

ac**

#includeusing namespace std;

int mp[10003];

int suo = -1;

int l,m;

int ans;

signed main()

for(int i=0;i<=l;++i)

if(i<=suo){}

else ans++;

}cout << ans << endl;

return 0;

}

題解 P1047 校門外的樹

我們可以通過for迴圈來實現操作,用乙個陣列來記錄是否有樹。當修改時,巢狀乙個for迴圈可以把這一部分標記下。如下 include using namespace std int main for int j 0 j c 1 j for int l 0 l b l cout 這麼簡單,一定是線段樹。...

P1047 校門外的樹

某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...

P1047 校門外的樹

某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...