ChuChu愛游泳
ChuChu很愛游泳,但疫情之後她很怕會被傳染,所以不去公共泳池。還是很想游泳的她打算在後院建造一座泳池 !
ChuChu的後院很特別,她後院的寬度只有 \(1\) ,所以她想到了一個好辦法。
她想利用兩面牆壁當作泳池的左界和右界,不過每塊地能承受的牆壁總重不一樣。
ChuChu想請你幫忙算出她的泳池最大能蓋多大。
輸入說明
第一行有一個正整數 \(N\),代表ChuChu有幾塊地。
下一行有 \(N\) 個整數 \(a_i\),代表第 \(i\) 塊土地能承受最大高度的牆壁。
- \(( 1 \leq N \leq 10^6 )\)
- \(( 0 \leq a_i \leq 10^5 )\)
- \(( 1 \leq i \leq N )\)
輸出說明
輸出一個正整數,代表ChuChu泳池的最大體積
範例輸入
9
1 8 6 2 5 4 8 3 7
範例輸出
49
說明
選擇第 \(2\) 和第 \(9\) 個牆壁可以讓泳池有最大體積 \( (9-2) \times min(8,7) \times 1 = 49 \)
子題
#No. | 額外限制 | 分數 |
---|---|---|
1 | \( N \leq 10^4\) | 40 |
2 | 無其他限制 | 60 |
评论
題解
觀看題解前請先好好想過題目,觀看完題解後也想想為什麼這樣寫能AC,如果你因此寫出比我效率更好的程式就更棒了٩(◦`꒳´◦)۶。
這題我原本想用分治法解(max(左邊最大值, 右邊最大值, 左牆+右牆體積))。
但發現如果測資長下面這樣就會出事。
觀察後發現如果用雙指標指向頭跟尾可以解決。
因為只要是包含在頭尾內的牆 AND 牆比頭跟尾都還要矮,就代表這個牆不可能形成更大的體積。(可以自行想想看為什麼,上面的題目的示意圖應該有幫助)
以下是作法:
從小的那個開始往後or往前找比自己更大的值(target)。
找到後把指標改成(target),同時算體積。
重複1, 2步驟直到 l >= r。
以下是程式碼: