poj 2452 rmq+二分

來源:互聯網
上載者:User

題意:給出一個數組,求一個最長的子數組si....sj,使子數組中si為最小值,sj為最大值。

演算法上沒有可以說的地方,需要總結的是我做題時的思維方式。

找出一段數組中的最大最小值可以確定用rmq來做,我開始的解決辦法是枚舉區間長度,複雜度是O(n^2),TLE。只能換個思路,枚舉起點,找某一起點出發的最大區間。我想當然的認為當i為起點的時候,r=rmqMax(i,n)就是終點,然後再判斷rmqMin(i,r)是否等於i來確定起點是i,如此枚舉,複雜度僅為O(n)。但是這樣的思路是錯的,原因在於當i為起點的時候,最大區間的終點並不一定是r,有可能在r的左邊。而最大區間可能就這麼被忽略了。

我們做題的時候常常會出現這樣的情況,自己認定是正確的方法其實是錯的,想想如果在比賽中,我們固執的相信自己,可能會這樣卡死在一個地方,確實後怕。這樣的情況是如何發生的呢?我們在思考解決方案的時候,每一步都是一個推理的過程,我們認為這樣的步驟是正確的,實際上是假設自己的推理是正確的,一步一步得到最終的解決方案。很可惜,由於各方面原因,我們往往不能每次都的到一個正確的假設,我們卻相信自己是正確的。那麼怎樣做出正確的假設呢?反思一下思考的過程,在不能得到一個確定的結論之前,我們往往做出各種猜想,然後對其一一驗證,以找出正確結果;但在驗證的過程中,可能就會把看上去正確的結果當成正確的結果,不去進行嚴謹的推理證明,這應該是長時間形成的思維上不好的習慣。所以,要避免做出錯誤的假設,就要克服我們不嚴謹的假設,對自己的推理進行嚴格證明。這雖然是個痛苦的過程,但我們遇到的大多數問題並不是太難以證明的,直觀上的解釋就已經足夠了。

總結一下就是,在做出解決問題的猜想時,一定要保證猜想是正確的,而不是看上去是正確的。

再回到這題上來,枚舉起點,然後找最大的終點這個思路是對的,現在的問題就是尋找這個終點了。我們從起點出發,每次驗證l[rmqMin(i+1,j)]>l[i],和l[j]>l[rmqMax(i,j-1)],找最大的長度,這樣的結果一定是對的但是複雜度又回到了O(n^2);再把驗證l[rmqMin(i+1,j)]>l[i],和l[j]>l[rmqMax(i,j-1)],的過程分開,先去找滿足l[rmqMin(i+1,j)]>l[i]的最大區間,i,j上的最大值的位置,就是終點,這個推理是正確的。找滿足l[rmqMin(i+1,j)]>l[i]的最大區間,可以發現,從起點出發,向右遍曆的過程中,要麼滿足l[rmqMin(i+1,j)]>l[i],要麼在經過某點之後所有的點都不滿足l[rmqMin(i+1,j)]>l[i],這可以看成廣義上的單調性,或者相當於一個函數,剛開始函數值是0,經過某點之後變成1,這樣就可以用二分發來找臨界點了。

到現在,這題的解決方案就可以確定了,先用rmq預先處理,使找某個區間上的最值能在O(1)時間內完成,再枚舉起點,用二分法找終點,得到最長的區間。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.