回滾莫隊 三校聯考 10 15 ants

2021-08-29 02:41:53 字數 1428 閱讀 2862

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

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

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

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

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

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

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

回滾莫隊應該說不是乙個新的東西了,在這場考試之前已經見過一次了,但是只寫了一道版題.

演算法的介紹引用某大佬的部落格(傳送門)

當乙個點被統計,則需要將與它相鄰的兩個數連上邊,最後統計一下答案.

另外可以利用鍊錶,比較快捷的維護出.

首先需要將之前的狀態清空,然後將右端點更新至當前詢問的位置,並且記錄下當前的答案,接著將左區間的點加進去,統計出答案,最後撤銷對於左區間的操作,將答案還原到之前的狀態.這樣做就免去刪除操作的時間,將時間複雜度進一步降低.

詳見**.

#include

#include

#include

using

namespace std;

const

int maxn=

100005

;int n,m,nowans,block,top;

int ans[maxn]

,bl[maxn]

,br[maxn]

;int a[maxn]

,stk[maxn]

,tag[maxn]

,t;bool vis[maxn]

;struct node

}que[maxn]

,qs[maxn]

;bool

cmp_l

(node a,node b)

bool

cmp_r

(node a,node b)

void

update

(int a)

void

restore()

}void

work

(int t,

int f)

void

sol()}

}int

main()

sol();

for(

int i=

1;i<=m;i++

)printf

("%d\n"

,ans[i]);

fclose

(stdin);

fclose

(stdout);

}

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...