題目鏈結
這個題比較簡單,怎麼做都行,但是看洛谷後面題解感覺還是有點複雜了,所以隨手寫一寫題解。
題目描述
某校大門外長度為 \(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,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...