#190: 根號做法


211096@stu.cchs.chc.edu.tw (唐狗針)

學校 : 彰化縣精誠中學
編號 : 872
來源 : [61.223.112.80]
最後登入時間 :
2025-04-13 12:49:20
a041. 奇怪的老闆 | From: [163.23.124.189] | 發表日期 : 2025-04-08 12:56

最大的問題是一個一個跑過的話,複雜度不好會超時。

如果把陣列切成$B$個部分,後面會把這些部分叫做塊,紀錄每個部分的最大值和最小值,只要$O(1)$就能知道一個部分的最小值和最大值。

不過並不是每次查詢都能很好的切在各個塊的端點,所以對於查詢導致不完整塊,就暴力跑過每一項求解,不過端點只有兩個,問題不是很大。

總共有$N/B$個塊,塊的大小是$B$,因此單次查詢的時間是$O(B+N/B)$。

根據算幾不等式,讓$B=\sqrt{N}$會有最小值,複雜度會是$O(\sqrt{N})$。

如此就能通過此題,這個技巧稱為 分塊 。

 
ZeroJudge Forum