題意
傳送門 p1903 [國家集訓隊]數顏色 / 維護佇列
題解帶修改莫隊與普通莫隊相比多了乙個對應修改操作的時間軸,每個查詢由二維的 (l,
r)
(l,r)
(l,r
) 變為三維的 (l,
r,t)
(l,r,t)
(l,r,t
)。基本思路即對查詢的前 w−1
w-1w−
1 維分塊,使前 w−1
w-1w−
1 維在塊內值域範圍受限,使第 w
ww 維在塊內有序,此時可以以較短的路線遍歷每個查詢。
具體而言,在查詢區間 [1,
n]
[1,n]
[1,n
] 進行分塊,以 l,r
,t
l,r,t
l,r,
t 為第
一、二、三關鍵字排序。設查詢次數 q
qq、修改次數 t
tt 與 n
nn 同量級,設 [1,
n]
[1,n]
[1,n
] 分為 a
aa 塊,那麼 l
ll 所在塊有 a
aa 種,r
rr 所在塊有 a
aa 種,總塊數為 a
2a^2
a2。在同一塊內,t
tt 呈單調性,那麼時間軸在各塊邊界修改次數為 o(n
)o(n)
o(n)
,在各塊內部修改次數為 o(n
)o(n)
o(n)
,總修改次數為 o(a
2n
)o(a^2n)
o(a2n)
;l ,r
l,rl,
r 在塊內的極大值與極小值差為 o(n
/a
)o(n/a)
o(n/a)
,塊間修改 o(n
)o(n)
o(n)
,總修改次數 o(n
×n/a
+a2n
)o(n\times n/a+a^2n)
o(n×n/
a+a2
n)。通過方程 n2/
a=a2
nn^2/a=a^2n
n2/a=a
2n,得到分塊數為 n1/
3n^
n1/3
,分塊大小 n2/
3n^
n2/3
。可以使用奇偶化排序進行優化。基本原理是對分塊的最後一維,即第 w−1
w-1w−
1 維,奇數塊對第 w
ww 維公升序排序,偶數塊第 w
ww 維降序排序,使第 w
ww 維在相鄰塊間修改的次數大概率減小。
#include
using
namespace std;
const
int maxn =
133335
, maxc =
1000005
;int n, m, qn, rn, res, id[maxn]
, col[maxn]
, rec[maxn]
, cnt[maxc]
;struct p1
} q[maxn]
;struct p2
r[maxn]
;inline
intread()
inline
void
add(
int i)
inline
void
del(
int i)
inline
void
upd(
int t,
int i)
intmain()
;else
r[++rn]
= p2;}
int w =
pow(n,
2.0/
3.0)
, t =
ceil((
double
)n / w)
;for
(int i =
1; i <= t;
++i)
for(
int l =
(i -1)
* w +
1, r =
min(i * w, n)
, j = l; j <= r;
++j)
id[j]
= i;
sort
(q +
1, q + qn +1)
;for
(int i =
1, l = q[1]
.l, r = l -
1, t =
0, ql, qr, qt; i <= qn;
++i)
for(
int i =
1; i <= qn;
++i)
printf
("%d\n"
, rec[i]);
return0;
}
P1903 國家集訓隊 數顏色 維護佇列
h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 這道題的帶修版本 s ol utio nsolution soluti on原來那道靜態主席樹就可以解決了,這道當然是樹套樹啦 可是,原來那道莫隊不是也...
國家集訓隊 數顏色 維護佇列(帶修莫隊)
題意 對給定的序列,回答m個詢問,q 詢問l到r中不同的顏色數量,r 將下標為x的顏色改為y 題解 帶修莫隊,相對普通的莫隊,加多了乙個關鍵字排序 include define num ch 0 define pn putchar n using namespace std templatevoid...
國家集訓隊 旅遊
題目背景 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心...