解法一(思路一):暴力模擬
//a - 校門外的樹
#include#includeint road[10001];//利用全域性靜態陣列全部初始化為0的特點
int caltree(int endofroad)
return cnt;
}void cutdown(int begin, int end)
int main(void)
int r = caltree(l);
cout << r;
return 0;
}
思路二:數學抽象-求並集問題
但是上面的方法太簡單了,實際上有了兩層迴圈,那麼時間複雜度大概就是o(n²)。有沒有方法可以下降到o(n)甚至o(logn)呢。而實際上這個問題很像有限覆蓋問題。我還沒學拓撲學,但是數軸的覆蓋問題還是可以想出來的。實際上,這個問題就是求並集罷了。那麼對於兩個閉區間,並集要麼是連在一起的(此時有交集),要麼是分立的。所以我們需要乙個方法,儲存閉區間們,而閉區間需要起點和終點,那麼我們只需要兩個陣列儲存區間開頭和結尾就好。(當乙個程式有多個迴圈時,時間取決於最多層的那個迴圈。)
**如下:雖然不可避免的出現了雙層迴圈,但是可以發現,內層迴圈的次數都不多,總體速度還是有優勢。
!這個**只過了樣例(實在改不了qwq,但是覺得這種思路有價值所以還是發出來)
#include#includeint a[10001], b[10001];
int p = 0;//當前儲存位置
bool isintersection(int a1, int b1, int a2, int b2)
void sumset(int begin, int end)
} p++;
a[p] = begin, b[p] = end;
return;
}int caltree()
return res;
}int main(void)
int r = caltree();
cout << l-r+1;
return 0;
}
這裡比較坑的是:
0 1 2 3 4 5 6 7 區間2 5 那麼就是砍了5-2+1=4顆樹,那麼總共有7+1=8個,所以是7+1-4=4個
校門外的樹 題解
洛谷 p1047 某校大門外長度為l ll的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l ll的位置 數軸上的每個整數點,即0,1,2,l ll,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終...
校門外的樹 (樹狀陣列)題解
校門外的樹 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作 k kk 1,讀入l ll,r rr表示在l ll r rr之間種上的一種樹 k kk 2,讀入l ll,r rr表示詢問l...
校門外的樹
描述 某校大門外長度為 l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0的位置,另一端在 l的位置 數軸上的每個整數點,即0,1,2 l,都種有一棵樹。馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...