Fişierul intrare/ieşire:lca.in, lca.outSursăArhiva educationala
AutorArhiva EducationalaAdăugată decella.florescuCella Florescu cella.florescu
Timp execuţie pe test1.4 secLimită de memorie131072 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Lowest Common Ancestor

Se dă un arbore cu rădăcină T. Cel mai apropiat strămoş comun a două noduri u şi v este nodul w care este strămoş al ambelor noduri u şi v şi are cea mai mare adâncime în T.

Considerăm că arborele T are n noduri şi are rădăcina în nodul 1. Dându-se o mulţime arbitrară P = {{u,v}}, cu m perechi neordonate de noduri din T, se cere să se determine cel mai apropiat strămoş al fiecărei perechi din P.

Date de intrare

Pe prima linie a fişierului de intrare lca.in se găsesc n şi m. Următoarea linie conţine n-1 numere naturale, cel de-al i-lea număr reprezentând tatăl nodului i+1 (nodul 1 fiind rădăcină nu are tată). Pe următoarele m linii se află câte o pereche de numere naturale, reprezentând elementele mulţimii P.

Date de ieşire

Fişierul de ieşire lca.out va conţine m linii, linia a i-a conţinând răspunsul celei de a i-a întrebări.

Restricţii

  • 1 ≤ n ≤ 100 000
  • 1 ≤ m ≤ 2 000 000

Exemplu

lca.inlca.out
11 5
1 1 2 2 2 4 4 6 3 3
10 11
8 9
5 11
5 6
4 2
3
2
1
2
2

Explicaţie

Arborele din exemplu arată ca în figura alăturată...

Indicaţii de rezolvare

O primă soluţie, care caută LCA-ul celor două noduri mergând "în sus" pe ramurile nodurilor până când acestea se intersectează, având complexitatea de O(N*M), ar trebui să obţină 30 puncte.

O altă soluţie descrisă în acest articol, având complexitatea finală de O(N + M\sqrt{N}), ar trebui să obţină 60 puncte. Deşi nu este cea mai eficientă, avantajul acestei soluţii constă în faptul că se implementează foarte repede.

O altă soluţie relativ uşor şi rapid de implementat în condiţii de concurs este cea care foloseşte ideea de la problema Strămoşi. Se reţine pentru fiecare nod strămoşul cu 2^{k} nivele mai sus, unde k ia valori între 1 şi log_{2}N. Astfel, pentru fiecare query, se aduce nodul de pe nivelul mai mare pe acelaşi nivel cu celălalt în timp logaritmic, după care, tot în timp logaritmic, se poate afla LCA-ul celor două noduri. Complexitatea finală este deci O(Nlog_{2}N + Mlog_{2}N). Această soluţie ar trebui să obţină 70 puncte.

O soluţie ce se foloseşte de algoritmul lui Tarjan care rezolvă query-urile offline, bazându-se pe structura de date mulţimi disjuncte. Aceasta are complexitatea de O(Nlog*N + M) şi ar trebui să obţină 70 de puncte din cauza numărului mare de query-uri. Asemenea metodei cu RMQ prezentată mai jos, şi această metodă foloseşte o cantitate mai mare de memorie, O(M) care în anumite condiţii nu se încadrează limitei de memorie. Un alt dezavantaj în anumite cazuri este faptul că query-urile nu se parcurg în ordine, ci se rezolvă offline, adică este necesară cunoaşterea lor în prealabil.

Soluţia care ar trebui să obţină 100 de puncte se bazează pe următoarea observaţie: „Cel mai apropiat strămoş comun a 2 noduri este nodul de nivel minim dintre primele apariţii ale nodurilor din query din reprezentarea Euler a arborelui.” În cazul de faţă, reprezentarea Euler a arborelui este următoarea, pe următorul rând găsindu-se nivelurile nodurilor:

Reprezentarea Euler12474842526962131031131
Nivelul012323212123210121210

Pentru exemplificare, nodurile 8 şi 9 au cel mai apropiat strămoş comun nodul cu nivel minim din secvenţa 8 4 2 5 2 6 9, adică nodul 2, care are nivelul 1. Pentru a implementa această soluţie, putem folosi arbori de intervale, având complexitatea O(N + Mlog_{2}N), soluţie care ar trebui să obţină 70 de puncte. Mai eficient, ţinând cont de restricţiile problemei, pentru determinarea minimului unei subsecvenţe se poate folosi RMQ. Astfel, complexitatea finală va fi O(Nlog_{2}N + M), această soluţie obţinând 100 de puncte. Dezavantajul acestei metode constă în faptul că se foloseşte O(Nlog_{2}N) memorie, ceea ce poate fi un impediment în anumite cazuri.

Un articol ce explică foarte bine atât RMQ, cât şi LCA se găseşte pe TopCoder.

Aplicaţii

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?

remote content