You are on page 1of 5

Bi 1: VOSSEVEN

Linkbi:http://vn.spoj.com/problems/VOSSEVEN/
Gif[i]lsccxuchgmccs7lintipvcdili.
Gians[i]lsccxucdiixuthintrnxus.
Ddngnhnthynutxucdilistorac1xudii,2xudi(i1),
nucf[i]xudiistocraf[i]xudii,f[i]*(i2+1)xudi2
>Duytvngi,nuf[i]>0:
>ans[j]=ans[j]+f[i]*(ij+1),vij<=i.
Cuicnglinraccgitrimans[i]>0.
PTO(n)

Bi 2: VOSTRIBO

Dngkinthcvnhnmatrn:
(nhngbnnochabitcthvolinksautmhiu:
https://sites.google.com/site/minhnhatcqt/baiviet/kithuatlaptrinh/matrix)

Nhnxt:
T[i2]=T[i3]*0+T[i2]*1+T[i1]*0+F[i1]*0
T[i1]=T[i3]*0+T[i2]*0+T[i1]*1+F[i1]*0
T[i]=T[i3]*1+T[i2]*1+T[i1]*1+F[i1]*0
F[i]=T[i3]*1+T[i2]*1+T[i1]*1+F[i1]*1
Nntacbngsau

T[i3]

T[i2]

T[i1]

F[i1]

T[i2]

T[i1]

T[i]

F[i]

Vector(T[i3],T[i2],T[i1],F[i1])nhnvimatrn((0,0,1,1),(1,0,1,1),(0,1,1,1),(0,0,0,1))
sracVector(T[i2],T[i1],T[i],F[i])

Bi 3: VOSCOMPS

VOSCOMPS Connected Components


Link bi: http://vn.spoj.com/problems/VOSCOMPS/vn
bi:
Cho th v hng N nh v Q truy vn thuc 1 trong 3 loi:
1.
Thm cnh (x, y).
2.
Xo cnh (x, y).
3.
Kim tra xem hai nh x, y c lin thng hay khng.
Gii hn:
- 2 <= N <= 10^5
- 1 <= Q <= 10^5
- Trong 50% tng s test, 1 <= N, Q <= 5000.
Lu :
-

Trong cng mt thi im, c th c nhiu cnh gia 2 nh x, y (a th).

i vi truy vn loi 2: nu c nhiu cnh (x, y), xo 1 cnh bt k, nu khng c


cnh no, khng lm g c.

Thut gii cho 50% s test:


Cch 1: Dng BST:
-

Cn biu din th bng BST: vi mi nh trong th cn lu mt cy BST


trong mi nt s gm mt cp kho/gi tr (std::map trong C++). K hiu
BST(x) l cy nh phn ca nh x. Trong BST(x) cha kho y nu th c t
nht mt cnh (x, y), v gi tr ca kho ny bng s lng cnh (x, y).

Truy vn 1: tm kho y trong BST(x) hoc thm kho ny vo BST(x) nu khng


c v tng gi tr ca kho ny ln mt n v; lm tng t trong BST(y). PT:
O(Log|V|).

Truy vn 2: nu kho y khng c trong BST(x), khng lm g c; nu c, gim gi


tr ca kho ny mt n v; nu gi tr bng khng, xo lun kho ny; lm
tng t trong BST(y). PT: O(Log|V|).

Truy vn 3: s dng BFS/DFS t x hoc y xt tnh lin thng. PT: O(|V| +


|E|).

Cch 2: Dng danh sch k


-

Truy vn 1: thm cnh (x, y) vo danh sch ca x v y. PT: O(1).

Truy vn 2: tm cnh (x, y) trong danh sch ca x v y ri xo i. PT: O(|E|).

Truy vn 3: ging nh cch trn. PT: O(|V| + |E|).

Thut gii cho 100% s test:


Nhn xt:
-

Da vo truy vn 1 v truy vn 2 c th to c mt danh sch cc cnh (x, y),


mi cnh c thm hai tham s tin v tout; trong khong [tin, tout) l thi
gian m c t nht mt cnh ni gia nh x v y trong th; thi gian c tnh
theo truy vn (gi s t 1 n Q). Nh test v d bi, cnh (1, 2) c tin = 1 v
tout = 3. to c danh sch ny c th s dng BST ging nh cch 1
trn.

Gi danh sch ny l P, s phn t ca P l O(Q).

Cch lm tru:
-

S dng cu trc d liu disjoint-set (DSU).

Vi mi truy vn 3 (gi k l thi gian ca truy vn ny, t 1 n Q), cho DSU v


gi tr mc nh, duyt ht tt c cc cnh trong P, cnh no c tin < k < tout,
th union hai nh ca cnh ny. Sau so snh find(x) v find(y) trong x
v y l hai nh ca truy vn ny xt tnh lin thng.

Nh vy mi truy vn 3 c PT l O(Q) (cha tnh PT ca find v union).

ci tin c cch sau: SQRT decomposition:


-

S dng cu trc d liu disjoint-set c thm chc nng rollback (dng


tr v cc trng thi c). Cch ci t s ni sau.

Chia truy vn ra sqrt(Q) nhm, mi nhm c sqrt(Q) truy vn.

Vi mi nhm:

1.

t L v R l thi gian ca truy vn u tin v cui cng ca nhm ny. Nh


vy L1 = 1, R1 = sqrt(Q), L2 = sqrt(Q) + 1, R2 = 2 * sqrt(Q)...

2.

Cho DSU v gi tr mc nh.

3.

Duyt ht tt c cc cnh trong P, cho vo hai nhm A v B. Trong nhm A


gm cc cnh c tin <= L v R <= tout, nhm B gm cc cnh c tin < R v L
< tout. Nh vy s phn ca nhm A bng O(Q), s phn t nhm B bng
O(sqrt(Q)).

4.

Duyt tt c cc cnh trong nhm A v union hai nh ca cnh ny.

5.

Lu li trng thi ca DSU.

6.

Duyt tt c cc truy vn 3 trong nhm ny, vi mi truy vn 3 (gi k l thi gian


ca truy vn ny, t 1 n Q):

6.1.

Duyt tt c cc cnh trong nhm B, cnh no c tin < k < tout th


union hai nh ca cnh ny.

6.2.

So snh find(x) v find(y) trong x v y l hai nh ca truy vn ny


xt tnh lin thng.

6.3.

rollback v trng thi c lu trn.

PT:
-

Bc 1: O(1).

Bc 2: O(N).

Bc 3: O(Q).

Bc 4: O(Q * PT(find)).

Bc 5: O(1).

Bc 6.1: O(sqrt(Q) * PT(find)).

Bc 6.2: O(PT(find)).

Bc 6.3: O(sqrt(Q)) (gii thch sau).

Bc 6: O(sqrt(Q) * (6.1 + 6.2 + 6.3)) = O(Q * PT(find)).

Nh vy vi mi nhm c PT: O(N + Q * PT(find)), c sqrt(Q) nhm,


tng PT: O((N + Q * PT(find)) * sqrt(Q)).

PT(find) = PT ca thao tc find, s bn ngay sau y.

Cu trc disjoint-set c chc nng rollback:


-

y mnh ci find khng dng php nn ng (path compression), union


s dng rank heuristic, do PT ca ca mi thao tc l O(log(N)). Nh vy
ch c thao tc union mi lm thay i cu trc ca DSU. Do cn s dng
thm mt stack lu gi cc gi tr v nh cha v th hng (rank) c trc
khi union hai nh.

PSEUDOCODE:
DSU gm c 2 mng sau:
parent[x] = nh cha ca nh x

rank[x] = th hng ca nh x
bc khi to gi tr mc nh: gn parent[x] = x, rank[x] = 0
bc lu li trng thi ca DSU: khi to stack gm cc phn t c
3 tham s: u (nh c), p (nh cha c), r (th hng c).
find(x)
while x <> parent[x] do
x = parent[x]
return x

union(x, y)
x = find(x)
y = find(y)
if rank[x] < rank[y] then swap(x, y)
thm phn t c u = x, p = parent[x], r = rank[x] vo stack
thm phn t c u = y, p = parent[y], r = rank[y] vo stack
parent[y] = x
if rank[x] = rank[y] then rank[x] = rank[x] + 1
rollback()
while vn cn phn t trong stack do
u = u ca phn t trn cng stack
p = p ca phn t trn cng stack
r = r ca phn t trn cng stack
parent[u] = p
rank[u] = r
xo phn t trn cng ca stack
-

Ta thy s lng phn t trong stack s bng O(s ln gi union) nn PT


bc 6.3 bng O(sqrt(Q)).
Tng PT ca thut gii ny l O((N + Q * Log(N)) * sqrt(Q)).

You might also like