1. 程式人生 > 其它 >AcWing 244 迷一樣的牛

AcWing 244 迷一樣的牛

題目傳送門

一開始我沒有什麼思路(太蒻了\(qwq\)),想不到這道題和樹狀陣列的聯絡是什麼。我主要是覺得僅僅根據題目給出的資訊,難以確定每頭牛的實際高度是多少。

現在重新回顧這道題,我認為,凡是這類一開始時,所求答案完全未知的問題,應該在邊界問題上尋找原問題的突破口。因為對於那些靠近問題空間“中部”的子問題,其“左右兩邊”可以認為和它是本質相同的子問題,沒有辦法直接解決。因此我們應該著重考慮邊界處的子問題。

在本題中,我們首先考慮最後一頭牛。由於它已經統計了在它之前的所有牛,因此,假如它比\(x\)頭牛高,則它的高度一定是\(x+1\)。我們採取從後往前考慮的方式,就是因為題目給出了“每頭牛已知在自己前面

比自己矮的牛的個數”這一條件,從後往前可以少考慮很多問題。

由於每頭牛的高度各不相同且取遍區間\([1,n]\),因此,對於倒數第二頭牛而言,它應該在去掉\(x+1\)的區間\([1,n]\)中,選取\(An−1+1\)小的數。其他的牛以此類推。

假如建立一個全部元素為1的數列,某個位置的數為1代表這個高度還不知道是哪頭牛的,那麼就用樹狀陣列維護該數列的字首和,若某個位置的字首和等於Ai+1Ai+1,此時的下標就是要找的數。選擇這個數後,將相應位置的1置0.可以二分這個位置。