ZJ i531 - 拿竿拿來 題解
<<回主頁
離線 ?
首先,肯定是可以算出答案的,但以這題的測資範圍顯然不夠快,雖然是區間查詢,但這裡也很難用線段樹之類的結構維護,因此會想離線看看。
普通的莫隊 (Mo's algo) ?
莫隊算法是一種離線演算法,把區間分成 個,可以以 的時間複雜度算出,是左右指標移動一格的複雜度。
將 做到
用普通的莫隊維護其實發現有點難把 做到 ,區間擴大沒啥問題,但區間變小的話很難做到 。
這時我們可以用「回滾莫隊」!
分成幾種情形,假設上一筆已經做好的查詢叫做,現在要求的這筆查詢叫做,分成以下幾種情形 :
1.如果 所在的區間和 一樣,那可以直接暴力做,因為暴力做的複雜度其實不會超過 。
2.否則,如果 所在的區間和 一樣,在一開始先把左指標移動到區間的最右邊,開始往左移動,而 因為保持遞增,所以照正常的擴大就好。
3.最後是 所在的區間和 不同,就移到下個區塊,把之前的全部刪掉從頭開始。
結論
我們可以發現不管哪一種 最多指標只會移動 次,最後此問題可在 內解決。