一道回滾莫隊的題 。

2021-08-29 02:44:11 字數 2238 閱讀 7729

3.1 description

然而貪玩的dirty 又開始了他的第三個遊戲。

dirty 抓來了n 只螞蟻,並且賦予每只螞蟻不同的編號,編號從1 到n。最開始,它們按某個

順序排成一列。現在dirty 想要進行m 場比賽,每場比賽給出l 和r ,表示選出從左向右數第l

只至第r 只螞蟻。被選出的螞蟻需要快速地按編號從小到大排序,之後這些螞蟻中編號連續的螞

蟻將圍成乙個圈。每場比賽結束後,螞蟻們還需要快速地回到最開始的位置。

按照螞蟻的審美標準,圍成的圈越大美觀值就越大。於是dirty 每次需要找到最大的圈,但由

於比賽多到難以處理,他只需要知道這個圈中螞蟻的數目。

3.2 input

第一行為兩個整數n,m,分別表示螞蟻的總數和比賽場數。

接下來一行n 個數,表示從左向右依次的螞蟻編號。

再接下來m 行,每行兩個數l、r,表示將從左向右數第l 只至第r 只螞蟻選出進行比賽。

3.3 output

輸出m 行,每行乙個整數表示該次詢問的答案。

3.4 sample input

8 33 1 7 2 5 8 6 4

1 45 8

1 73.5 sample output33

43.6 note

對於20% 的資料,n 500;m 500;

對於50% 的資料,n 30000;m 30000;

對於100% 的資料,n 100000;m 100000。

普通莫隊過不了這道題,這時有了回滾莫隊(只能離線處理一段區間啊啊!!!)

把1到n分成√n 份。對於所有詢問按左端點先從小到大排序;

一塊一塊的處理;

對於每一塊,先找出所有左端點在塊中的詢問,然後再按右端點從小到大排序,

左指標最開始指向這塊的最末乙個元素,

右指標指向下一塊的第乙個元素。

乙個乙個詢問來處理,右指標只會一直往右動(同塊詢問,按右端點從小到大排序),所以只會加入不會刪減。

對於每乙個詢問,左指標一點一點向左往當前詢問左端點動。用乙個棧來記錄加入了哪些點。

動到前詢問左端點時,完成本次詢問,滾回到這塊的最末乙個元素。(即彈棧)。

當這塊所有詢問處理完後,處理下一塊=。=

sort(qx+1,qx+1+m,cmp);//把所有詢問按左端點排序

int kuai = (int)(sqrt(n) + 1e-8);

for(int i = 1; i <= n; i += kuai)

//找出左端點在這一塊的所有詢問

if(shu == 0) continue;

zu ++;

sort(q+1,q+1+shu,cmp1);//同一塊的詢問按右端點排序

int nowr = min(n,i + kuai - 1);

for(int j = 1; j <= shu; j++)

//右指標向右動。

int temp = rans;//右指標所做的貢獻對下乙個詢問有用,所以單獨儲存

for(int k = min(q[j].r,min(n,i + kuai - 1)); k >= q[j].l; k--)

//左指標向左動。

ans[q[j].num] = rans;

restore();//左指標往回滾

rans = temp;

} }for(int i = 1; i <= m;i++)

return 0;

}

CodeChef LNDNCK 回滾莫隊

鏈結 給你兩個陣列,b,p,陣列個數n 小於等於 2e5.m 個詢問,每次詢問 l r,把 區間 l,r 按照 b 的公升序排序,然後求和 abs p i p i 2 一開始的思路就是直接暴力莫隊,每次把 b 插入到map 裡面去,刪除也是直接從 map 裡面刪除。每次修改只會影響周圍的幾個值。但是...

回滾莫隊初步

正常莫隊,時間複雜度的保證 於分塊和每次挪動指標的 o 1 或 o log 的修改。然而像可持續化並查集的思想一樣,在某些題中因為題目要求,導致並查集不能路徑壓縮,而要把時間版本存到棧,彈棧回溯時間版本。有些題在適應題目中發現,只有擴充套件區間 縮小區間的時間複雜度 那麼就輪到回滾莫隊解決問題。實現...

P5906 模板 回滾莫隊 不刪除莫隊

p5906 模板 回滾莫隊 不刪除莫隊 回滾莫隊是拿來幹什麼的呢?在我們維護的資料不好刪除,但是可以撤銷,比較好新增的時候就可以使用回滾莫隊來維護。同樣反過來也是,但是好刪除不好新增應該很少見吧。fad 那麼具體怎麼做的呢?首先認清楚裸回滾莫隊的效率 大常數 o n sqrt 就是跑滿了的 n sq...