Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2010-01-15 16:04:12.
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. În acest plan, dacă  p(p_{1}, p_{2}) iar  q(q_{1}, q_{2}) , atunci distanţa dintre aceste două puncte este:  \sqrt{(p_{1} - q_{1})^2 + (p_{2} - q_{2})^2} .

Cerinţă

Să se determine distanţa între 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.
  • 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.

Aplicaţii

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

Cum se trimit solutii?