然而貪玩的 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...