Documente Academic
Documente Profesional
Documente Cultură
5 Noiembrie 2023
1 Mult, umiri
Acest concurs nu ar fi putut avea loc fără următoarele persoane:
• Matei Ionescu, Theodor Ioan Pirnorg, Traian Mihai Danciu, autorii prob-
lemelor s, i laureat, i la concursurile de informatică s, i membri activi ai co-
munităt, ii RoAlgo.
• Alex Vasilut, ă, fondatorul s, i dezvoltatorul principal al Kilonova
• Andrei Chertes, Ioana Frant, , testerii concursului, care au dat numeroase
sugestii s, i sfaturi utile pentru buna desfăs, urare a rundei.
2 Problema nr9
Autor: Matei Ionescu
1
2.2 Cod sursă s, i solut, ie video
Solut, ie de 100
Solut, ie video
3 Problema divnr
Autor: Traian Mihai Danciu
4 Problema muxusetre
Autor: Traian Mihai Danciu
2
Deci problema se reduce la aceasta: Se dă un număr n, ı̂n câte moduri putem
lua 2 indici care să aibă aceeas, i paritate (observat, i că aici este inclus s, i 0).
Pentru a rezolva această problemă nouă, trebuie doar să numărăm cât, i indici
pari avem (notat cu p), s, i câti indici impari avem (notat cu i):
p = ⌊ n2 ⌋ + 1
i = ⌈ n2 ⌉
Iar acum putem lua doi indici pari ı̂n p·(p−1)2 , iar cu impari ı̂n mod
i·(i−1)
asemănător: 2 . S, i adunând aceste două numere, obt, inem rezultatul.
Complexitate: O(n) timp (deoarece trebuie să citim s, i s, irul, ca să aflăm
următorul n) s, i O(1) memorie, pentru fiecare subtest.
Solut, ia care ret, ine numerele zi s, i ui ı̂n 2 variabile, pe care le actualizeaza, va
lua s, i ea punctajul maxim, dar având ı̂n vedere ce am spus mai sus, nu este
nevoie de acele 2 variabile.
5 Problema 3secv
Autor: Traian Mihai Danciu
3
6.1 Solut, ia oficială
Pentru a obt, ine răspunsul optim, trebuie să afis, ăm numai cifre prime. De ce
este optim? Pentru că, de exemplu, dacă am avea a = 8, atunci dacă am afis, a
b = 8, am avea 7!, s, i cu 8, dar ar fi mai optim să afis, ăm b = 7222, pentru că
are mai multe cifre.
Apoi precalcula numerele prime până la n folosind ciurul lui Eratostene. Vom
descompune ı̂n factori primi ai ! (1 ≤ i ≤ k), folosindu-ne de formula lui
Legendre.
Apoi putem itera prin numerele prime ı̂n ordine descrescătoare, afis, ând
numerele de câte ori ne spune frecvent, a numărului curent, iar apoi actualizăm
frecvent, a numerelor mai mici tot folosind formula lui Legendre.
Pentru mai multe detalii legate de implementare accesat, i link-ul de mai jos de
la solut, ia de 100. Complexitate: O(n2 / log n + k · n) timp (deoarece sunt
n / log n numere prime, formula lui Legendre pentru fiecare cifră este
O(n / log n · log n) = O(n), iar formula lui Legendre pentru fiecare număr
prim este tot O(n / log n · log n) = O(n)), s, i O(n) memorie (pentru ciur,
numere prime, s, i frecvent, ă)
7 Problema cuvinte
Autor: Theodor Ioan Pirnog
4
8 Problema joingraf
Autor: Traian Mihai Danciu
5
9 Problema suxumetre
Autor: Matei Ionescu
Vom simplifica mai intai problema prin precalcularea costului pe fiecare
interval ı̂mparte.
O idee ar fi sa fixăm un i s, i să ret, inem suma pe intervalul [i, j], mod m, s, i
atunci putem pentru fiecare k de la 1 la m să numărăm câte interval cuprinse
intre [i, j] se termină ı̂n j s, i au suma mod m = k. Dacă s, tim că
Suma(l = i)( j) = A mod m, atunci numarul de intervale care se termină in J
s, i au suma mod m = k va fi dat de pozitiile unde sph = (A + mod − k)
mod m. Ca să le numărăm putem să ret, inem un vector de frecvent, ă cu M
elemente.
6
9.3 Cod sursă s, i solut, ie video
Solut, ie de 100
Solut, ie video
10 Problema cucuruz
Autor: Matei Ionescu
Practic problema ne ı̂ntreabă care este suma valorilor de pe fiecare lant, cu
lungimea mai mică sau egală cu P . Restrict, ia cu W < D este pusă pentru a
sugera că nu se numără acelas, i drum de 2 ori.
Putem sa precalculăm sumele part, iale pentru fiecare nod s, i să fixăm oricare 2
noduri, verificăm dacă distant, a dintre cele 2 noduri este mai mică sau egală cu
p s, i adunăm la rezultat suma de pe lantul respectiv; Complexitate: O(n2 log n)
Putem să ne calculăm ı̂n cnt(nod, i) suma de pe toate lant, urile care ı̂ncep ı̂n
nod s, i se termina ı̂ntr-un nod din subarborele lui cu distant, a i s, i ı̂n pl(nod, i)
câte noduri din subarborele lui nod sunt la distant, ă i fat, ă de nod.
Acuma putem pentru fiecare nod să ne calculăm suma totala pentru lant, urile
care ı̂ncep ı̂n subarborele lui nod, trec prin nod s, i se termină tot ı̂n subarborele
lui nod.
Fie f1 , f2 , f3 , . . . , fk tot, i fii lui nod. Dacă ne alegem un nod fi s, i o distant, ă pi ,
atunci putem să aflăm suma cnt(fk , pk ) s, i pl(fk , pk ), cu k < i s, i pi + pk ≤ P s, i
să adunăm la rezultat suma + cnt(fi , pi ) · suma1; Pentru a optimiza aflarea
sumei s, i a numărului de noduri aferente, putem să folosim 2 arbori indexat, i
binar. Complexitate: O(p · n log n)
Putem să ret, inem doar sumele part, iale s, i atunci complexitatea devine O(n ∗ p).
7
10.2 Solut, ia oficială
Putem reimplementa ideea de la subtask-ul 5 doar ca vom aborda diferit
problema s, i ne vom folosi de o tehnică foarte utilă numită ”Centroid
Decomposition”. O idee bună ar fi să aflăm centroidul arborelui init, al.
Aplicăm ideea de la subtaskul 5, eliminăm centroidul din arbore si apelăm
recursiv pentru fiecare subarbore rezultat.
De ce complexitatea devine O(n · log 2 n)? Mai ı̂ntâi hai să clarificăm ce este
un centroid. Un centroid este un nod pe care dacă-l eliminăm, numărul de
noduri din subarborii rezultat, i sunt mai mici sau egali cu N/2, unde N e
numărul de noduri din arborele init, ial.
Astfel dacă descompunem arborele eliminând centroizii, atunci fiecare nod va
apart, ine de maxim O(log n) componente conexe pe parcursul descompunerii.
Astfel complexitatea se poate exprima ca O(log n) · f (N ) unde f (N ) este
timpul necesar pentru a afla toate lant, urile bune care trec prin fiecare centroid.
f (N ) = O(n log n) deorece trebuie să precalculăm matricea cnt pentru fiecare
nod din componenta respectiva ·log n (de la aib-uri). Putem scăpa de matricea
cnt dacă luăm doar suma de la A la centroidul respectiv (că ne este ı̂ndeajuns).