Kružne zone – uputstvo
Postavka
Meta se sastoji od n kružnih zona oko koordinatnog početka. Prva zona je krug, a svaka sledeća je kružni prsten oko prethodne. Zadate su širine zona redom od centra ka spolja. Za svaku od m tačaka (x, y) ispiši redni broj zone u kojoj se nalazi (zone se broje od 0) ili izvan ako je tačka van svih zona. Tačka na granici dve zone pripada unutrašnjoj zoni.
Ulaz: broj n, zatim n širina; broj m, zatim m parova koordinata (n, m ≤ 50 000).
Napomena: postavka je zapisana na osnovu postojećeg rešenja zadatka.
Primer
Ulaz
3
1 2 3
5
0 0
1 0
2 2
5 0
6 1Izlaz
0
0
1
2
izvanUputstvo
1. Od širina do poluprečnika. Unose se širine prstenova, a za proveru nam trebaju poluprečnici spoljnih granica. Poluprečnik granice zone i je zbir širina zona 0..i: r[i] = r[i − 1] + širina[i]. Pošto su širine pozitivne, niz r je rastući – što omogućava binarnu pretragu.
2. Rastojanje tačke. Tačka (x, y) je udaljena od centra R = √(x² + y²).
3. Koja zona? Tačka je u zoni z ako je r[z − 1] < R <= r[z] (za z = 0 donja granica je 0). Dakle z je prva pozicija u nizu r na kojoj je r[z] >= R. Nju nalazimo binarnom pretragom ili funkcijom lower_bound. Ako takve pozicije nema, tačka je izvan mete.
| Zona | Širina | Granica r[z] | Tačke u zoni |
|---|---|---|---|
| 0 | 1 | 1 | R ≤ 1 |
| 1 | 2 | 3 | 1 < R ≤ 3 |
| 2 | 3 | 6 | 3 < R ≤ 6 |
4. Složenost. Za svaku tačku binarna pretraga radi log₂ n ≈ 16 koraka, ukupno O(m log n). Linearna provera svih zona bila bi O(m · n) = 2,5 · 109 – prespora.
"KRUŽNE ZONE" - UPUTSTVO ZA REŠAVANJE ZADATKA
Oblast: binarna pretraga, sortiranje nizaPotrebna su 3 niza:
- poluprečnici koncentričnih krugova koji predstavljaju zone i ima ih n(unosi se)
- X koordinate tačke unutar zona, ima ih m(unosi se)
- Y koordinate tačke unutar zona, ima ih m(unosi se)
Dalje treba, koristeći algoritam binarne pretrage tražiti poziciju u nizu poluprečnika, gde se rastojanje R od centra do tekuće tačke M(x,y)
nalazi u pojasu koji prethodi poluprečniku u nizu na ispitivanoj poziciji.
Npr ako je izračunato rastojanje tekuće tačke od centra R a poluprečnik u nizu na tekućoj poziciji s iznosi r[s], onda bi pronalaženje indeksa pojasa gde se tačka nalazi izgledala:
if(R>r[s-1] && R<=r[s])
{
pronađenPoluprecnik=true;
poz=s;
break;
}
Prethodno proveriti da li na indeksu s-1 ima elementa u nizu r. Ako nema, npr kad je s=0, onda je prethodni poluprečnik jednak nuli.
Sledeći kod to moze da reši:
/*Odredjuje prethodni poluprecnik*/
if(s-1<0) //ako je s pocetni index onda je manji krug prstena poluprecnika jednakim nuli
{
rP=0;
}
else{
rP=r[s-1];
}
