Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2010-01-15 22:29:41.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:cmap.in, cmap.outSursăArhiva educationala
AutorArhiva EducationalaAdăugată deCoroian_DavidCoroian David Coroian_David
Timp execuţie pe test0.2 secLimită de memorie20480 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Cele mai apropiate puncte din plan

Considerăm un plan euclidian ce conţine n puncte date prin coordonatele lor. Distanţa euclidiană dintre două puncte  A(x_{1}, y_{1}) şi B (x_{2}, y_{2}) se calculează conform formulei:  \sqrt{(x_{1} - x_{2})^2 + (y_{1} - y_{2})^2} .

Cerinţă

Să se determine distanţa dintre cele mai apropiate două puncte.

Date de intrare

Fişierul de intrare cmap.in conţine pe prima linie un număr n cu semnificaţia din enunţ. Pe următoarele n linii se vor afla câte două numere xi şi yi, separate printr-un spaţiu, semnificând coordonatele celui de al i-lea punct.

Date de ieşire

În fişierul de ieşire cmap.out se va afişa distanţa dintre cele mai apropiate două puncte din planul euclidian.

Restricţii

  • 1 ≤ n ≤ 100 000.
  • -109 ≤ xi ≤ 109.
  • -109 ≤ yi ≤ 109.
  • Oricare două puncte sunt distincte.
  • Orice număr se găseşte la coordonate numere întregi.
  • Răspunsul va fi considerat corect dacă are o eroare de cel mult 10-6.
  • Pentru 20% din teste 1 ≤ n ≤ 1 000.

Exemplu

cmap.incmap.out
10
26 77
12 37
14 18
19 96
71 95
91 9
98 43
66 77
2 75
94 91
18.681542

Indicaţii de rezolvare

O soluţie ce consideră fiecare pereche de puncte are complexitatea O(N2) şi obţine 20 de puncte.

O alta soluţie de complexitate O(N*N*log2N) sortează numerele crescător după abscisa şi apoi foloseşte un algoritm divide et impera. Se împart cele N puncte în doua grupuri st şi dr, se calculează st_min şi dr_min, distanta intre cele mai apropiate puncte din grupul st şi dr, apoi se calculează st_dr_min, distanta intre cele mai apropiate 2 puncte, unul aparţinând grupului st şi altul lui dr. Distanta intre cele mai apropiate puncte o sa fie minim(st_min, dr_min, st_dr_min).

Se observa ca cea mai costisitoare operaţie este cea la care se calculează st_dr_min. Aceasta se poate reduce de la O(N*N) la O(N) folosind următoarea observaţie: notam cu dist minimul dintre st_min si dr_min. Pentru orice punct P din grupul st este suficient sa ne uitam la punctele din dreptunghiul cu laturile dist si 2*dist din grupul dr ca in figura.
Se observa ca în dreptunghi sunt maxim 6 astfel de puncte, deci complexitatea se reduce de la O(N*N) la O(6*N), astfel complexitatea finala devenind O(N*log2N). Aceasta soluţie foloseşte ideea prezentata mai sus şi obţine 100 de puncte.

Marius: 1. Un evaluator ce compară rezultatele cu o eroare de 10-6. 2. Ar mai trebui o sursă în O(N^2 log(N)). 3. Sursa ta de 100 de puncte nu e în concordanţă cu explicaţia. Eu zic că faci bine în sursă şi că ar merge explicaţia din CLR. 4. Am mai modificat limita de timp la 1s.

Aplicaţii

  1. Harta2
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?