Sunteți pe pagina 1din 8

Subject: Re: [ubb-acm] Probleme de geometrie computationala (schite de rezolvar

e 1)
ADVERTISEMENT
>
>
>
>
>

1. ** Se dau coordonatele a n puncte din plan


(n<=1000). Gasiti o
dreapta care contine cele mai multe puncte coliniare
din punctele
date (cormen).

algoritm O(n^2 log n):


Se cauta pt fiecare punct care este dreapta ce trece
prin acest punct si contine cele mai multe puncte din
multime pe ea. Se ordoneaza punctele in jurul fiecarui
punct in functie de unghiul pe care il fac cu
orizontala. Si acuma se parcurg punctele in ordine si
se verifica daca mai multe puncte formeaza acelasi
unghi. Sortarea e n log n si cum sunt n puncte =>
complexitatea e O(n^2 log n).
algoritm O(n^2):
Se foloseste transformarea duala. O sa explic
altadata ec e cu transformarea asta, oricum ideea e
foarte faina dar trebuie memorie O(n^2).
>
>
>
>
>

2. ** Se dau coordonatele a n puncte din plan


(n<=1000). Se cere sa
se gaseasca daca exista sau nu un triunghi cu
varfurile in cele n
puncte care sa fie dreptunghic.

algoritm O(n^2 log n):


tot asa se face ca si la problema anterioara. Se
porneste cu un indice i1 si cu un indice i2. i2 se
incrementeaza cat timp unghiul dintre p[i1], p[curent]
si p[i2] e mai mic decat 90 de grade. Dupaia i1 se
incrementeaza o data si tot asa facem o parcurgere a
punctelor sortate in O(n). Deci complexitatea e
O(n)*(O(n log n)+O(n)) = O(n^2 log n).
>
>
>
>
>

3. Se dau n puncte de coordonate intregi (n<=1000)


se cere sa se
determine un poligon cu varfurile in aceste puncte
(ceva de genu
asta s-a dat la lot prin 94).

Algoritm O(n log n):


Se sorteaza n-1 puncte in jurul primului punct si se
leaga intre ele punctele in poligon in ordinea data de
sortare.
> 4. Se dau n puncte (n<=10000). Sa se determine
> infasuratoarea
> convexa a celor n puncte (cormen,stroe).
....

>
>
>
>
>
>

5. ** Se dau 2 poligoane convexe fiecare avand


maxim 1000 de
varfuri. Se cere sa se determine intersectia lor
(bursele agora,i-am
dat 2 stele desi la concurs am complicat-o rau de
tot).

Se poate verifica ce puncte din primul poligon sunt


interioare celui de al doilea si dupaia ce puncte din
al 2-lea poligon fac parte din primul si sa se adauge
la multimea asta de puncte punctele de intersectie ale
laturilor celor 2-a poligoane. Acuma mai ramane de
facut algoritmul de infasuratoare convexa pt punctele
astea. Complexitate O(n^2). Exista un algoritm destept
in O(n), da nu cred ca se merita sa fie invatat pt
concurs.
>
>
>
>
>
>
>

6. *** Se dau n puncte (n<=10000). Sa se determine


perechea de
puncte din cele n cu distanta maxima intre ele
(parca am vazut-o pe
la ceva acm, s-ar putea sa fie si in cormen, medie +
* daca nu stiti
cum sa o faceti, implemenatrea e *).

Evident perechea de puncte la distanta maxima se


afla pe marginile infasuratorii convexe. Daca punctele
nu sunt bine alese (adica random) o sa fie putine
puncte pe conturul infasuratoarei convexe deci aici ar
merge bruteforce O(h^2) unde h e numarul de puncte de
pe infasuratoarea convexa.
Exista 2 algoritmi mai buni O(h log h) si O(h).
Primul : pt fiecare punct se cauta cu cautare binara
al 2-lea punct.
Al doilea: se foloseste o tehnica asemanatoare cu
aceea care s-a folosit la problema cu triunghiul
dreptunghic. Avem 2 indici i1,i2 de puncte de pe
infasuratoarea convexa. cat timp distanta dintre i1 si
i2 e mai mica decat aceea dintre i1 si i2+1 se
incrementeaza i2. Se actualizeaza la fiecare pas
distanta maxima. Se incrementeaza i1. Asta se face
pana cand i1 ajunge sa fie a 2-a oara primul punct.
Evident acest algoritm are complexitatea O(h).
>
>
>
>
>

6 b *** Se dau n puncte (n<=10000). Sa se determine


perechea de
puncte din cele n cu distanta minima intre ele.
(cormen si bursele
agora)

....
>
>
>
>
>

7. * Se dau n puncte (n<=400) oricare 3


necoliniare. Gasiti un romb
cu varfurile in punctele date, (daca exista) (s-a
propus pe lista de
discutii [olimpiada] acum vreo 2 ani).

O(n^3 log n), O(n^3): Se iau oricare 3 puncte si


acest triunghi daca e isoscel se poate completa

intr-un singur fel ca sa devina romb, daca e


echilateral se poate compleat in 3 moduri si punctele
lipsa se cauta prin cautare binara intre punctele
sortate O(log n), sau se cauta intr-o tabela de
dispersie (hash table) in O(1).
O(n^2 log n), O(n^2): Amintesc proprietatea ca la
romb diagonalele sunt perpendiculare si se
injumatatesc. Se iau toate perechile de puncte, se
determina mijloacele segmentelor si panta lor si se
sorteaza sau se bvaga intr-o tabela de dispersie.
Dupaia pt fiecare mijloc si panta se cauta daca exista
in structura de date (sir ordonat sau hashtable)
acelasi punct cu panta perpendiculara. Daca orice
cautare are succes inseamna ca am gasit un romb.
>
>
>
>
>
>
>

8. Se dau n puncte (n<=500). Gasiti un patrat arie


minima care
contine in interior sau pe frontiera cel putin
jumatate din punctele
date (internet problem solving contest 2002, astia
au probleme faine
de tot).

Aici am uitat ca axele patratului trebuiau sa fie


paralele cu axele de coordonate.
O(n^2 log n) timp, O(n^2) memorie: Se obtine lista
ordonata a x-lor si lista ordonata a y-lor. Acuma se
foloseste o matrice unde a[i][j] inseamna ca exista un
punct in multime de coordonate x[i],y[j]. Pentru o
lungime data se poate verifica in O(n^2) daca exista
patrat cu dimensiunea asta care sa contina jumatate
din puncte. Si cu o cautare binara e gata problema.
Numarul de dimensiuni diferite e de ordinul lui n^2
(adica diferentele dintre xi,xj si yi,yj) care se pot
ordona si folosi in cautarea binara a lungimiioptime
de latura.
Pe siteul de la ipsc este o rezolvare in O(n^2 log^2
n). Cred ca si rezolvarea de mai sus poate fi
imbunatatita ca sa nu se foloseasca chestia cu
distantele de la sfarsit.
>
>
>
>
>
>
>
>
>
>
>
>

9. ***** Se dau n puncte in plan (n<=1000) de


coordonate intregi
mai mici
in modul ca 250, oricare 3 necoliniare. Gasiti un
triunghi cu
varfurile in punctele date de perimetru minim. (Nu
stiu o rezolvare
simpla la problema cu restrictie 250, dar cred ca
pot face o
rezolvare un pic mai complicata pentru coordonate
reale.) (lista
[olimpiada])

La vremea respectiva cand s-a discutat problema se


vorbea despre o cautare locala a cate trei puncte.
Tehnicii ii zice bucketing si este foarte folositoare

uneori. Rezolvarea care o aveam eu in minte e o


generalizare a problemei distantei minime. Oricum nu
am o rezolvare eleganta la ora actuala.
>
>
>
>
>
>
>

10. ***** Se dau n puncte in plan (n<=1000) de


coordonate reale. Se
cere sa se determine triunghiul de arie minima cu
varfurile in
punctele date. (lista [olimpiada], este o rezolvare
in N^2 dar
destul de dura)

Csabi a facut problema asta pt proiectul de la


geometrie. E o rezolvare destul de grea care se
bazeaza pe transformare duala, arbori echilibrati de
cautare si un sweep line.
>
>
>
>
>
>
>
>
>

11. **** Se dau n drepte (n<=1000). Sa se determine


dreptele
vizibile din origine. (am auzit-o de la Dumitran si
este si pe lista
lui Francu, exista o rezlvare mai usoara cu un pic
de cunostinte,
daca se face muncitoreste problema e grea, daca se
face cu idee
problema e *)

Tot cu transformare duala.


>
>
>
>
>
>
>
>
>
>

12. **** Se dau n puncte in plan (n<=100000). Se


cere sa se
determine cercul de raza minima care le contine in
interior pe toate
punctele. (Balkan OI 2002, si
http://www.fudv.ro/campion/, daca
testele sunt slabe ... atunci problema ar merita *
altfel exista un
algoritm randomizat al lui Welzl care rezolva
problema in O(N))

Cestia cu testele slabe e cea cu nr mic de puncte pe


infasuratoarea convexa.
>
>
>
>
>
>
>

13. *** Se dau n puncte in plan (n<=1000) si un


numer real pozitiv
r. Se cere sa se determine cercul de raza r ce
contine numarul maxim
de puncte in interior. (topcoder o varianta cu n mai
mic, si CEOI 96
sau 97, problema faina, de idee)

O(n^3). Pt orice pereche de 2 exista 2 cercuri de


raza r care au aceste puncte pe contur. In O(n) se
verifica nr de puncte in interior.
O(n^2 log n). Se considera un punct ce sa fie pe
contur. Se ordoneaza punctele in functie de ce unghi
va face centru cercului cand intra in cerc si cu ce
unghi face centrul cercului cu punctul cand ies din
cerc. La fiecare punct se incrementeaza sau

decrementeaza nr de puncte din centrul curent.


>
>
>
>
>
>
>

14. *** Se dau n dreptunghiuri cu laturile paralele


cu axele de
coordonate ce se pot suprapune(n<=1000) . Se cere
aria figurii
acoperite de aceste dreptunghiuri. (IOI 98, selectie
lot acm
Universitatea Bucuresti)

Se poate face o matrice cu dimensiuni 2n*2n. un fel


de matrice redusa in care a[i][j] inseamna daca
dreptunghiul (x[i],x[i+1])*(y[j],y[j+1]) este ocupat
sau nu (unde x e sirul tuturor coordonatelor x
sortate, y la fel).
Sau se poate face analiza fiecare banda de y[i]y[i+1]
si determina in O(n) aria ocupata dee pe banda asta,
daca se sorteaza dreptunghiurile in ordinea x-lor.
Se poate face si in O(n log n) cu arbori de intervale
(cormen).
>
>
>
>
>

15. *** Se dau n triunghiuri dreptunghice isoscele


cu laturile
perpendiculare paralele cu axele de coordonate
(n<=1000). Se cere
aria reuniunii triunghiurilor. (BOI 2002)

Se ordoneaza punctele pe x si se face o scanare, din


aproape in aproape se trateaza fiecare banda pe y. De
la x[i] la x[i+1].
>
>
>
>
>
>
>

16. Se da un numar natural n. Care este numarul de


regiuni in care
se imparte planul de n cercuri care nu se
intersecteaza cate 3 intrun punct si oricare 2 se intersecteaza in 2 puncte (
:) problema de
pe UVA).

Prin inductie se determina numarul de regiuni. Daca


pt n avem X(n) regiuni, cand se adauga al n+1 lea cerc
acesta se intersecteaza cu cele n cercuri in 2n
puncte. Deci o sa fie n regiuni impartite in 2 de
cercu asta, deci se adauga n regiuni noi. Recurenta e
X(n+1)= X(n)+n sau ceva de genu asta.
>
>
>
>
>
>
>
>

17. *** Care este numarul maxim de regiuni in care


se inparte
planul daca folosim n drepte. Aceeiasi problema
pentru cercuri.
Aceeiasi problema pentru spatiu si sfere (problema
data la bursele
agora) (Probleme neelementare tratate elementar
Iaglom,Iaglom).

Se foloseste ideea de mai sus.


> 18. * Avem n drepte in plan fiecare dreapta fiind
> data prin 2
> perechi de coordonate (n<=100). Sa se determine in

> cate zone se


> imparte astfel planul (internet problem solving
> contest 2001).
Aceeiasi idee de mai sus. Se vede la fiecare pas
cate drepte intersecteaza o dreapta si asa se vede
cate regiuni noi se adauga la cele vechi.
>
>
>
>
>

19. ** (problema de-a mea :)) Se dau n de puncte de


coordonate
intregi (n<=10000). Sa se determine cate triunghiuri
cu varfurile in
punctele astea au ca arie un numar intreg.

Dupa cum stiti aria unui triunghi e abs(1/2*


det(x1,y1,1,x2,y2,1,x3,y3,1)) deci daca aria unui
triunghi e intreaga daca determinantul e par.
Paritatea determinantului e data de paritatile
coordonatelor. Acuma clasificam coordonatele in 4
clase: (x par, y par),(x impar, y par)(x impar, y
impar)(x par, y impar). Si ce mai ramane de facut e sa
verificam ce triplete de clase dau determinant par.
> 20. * Sa se determine aria unui poligon oarecare ce
> are n varfuri
> (n<=10000).(judeteana Bistrita,97)
http://www.faqs.org/faqs/graphics/algorithms-faq/
Aici sunt cateva chestii simple de geometrie
computationala printre care si aria unui poligon.
> 21. Sa se determine daca un poligon cu n varfuri
> (n<=100000) este
> convex.
Daca fiecare triunghi de 3 puncte consecutive de pe
marginea poligonului are acelasi semn atunci poligonul
e convex.
> 22. Sa se determine daca un poligon are varfurile
> date in sens
> trigonometric sau sens orar (n<=100000).
Daca aria are un semn punctele sunt date in sens
orar, daca nu ele sunt date in sens trigonometric. Se
verifica experimental ce sens e bun.
Altfel: se determina cel mai de jos punct de pe
poligon si se verifica in ce sens e orientat
triunghiul cu trei puncte consecutive de pe conturul
poligonului pt care punctul cel mai de jos e la
mijloc.
>23. Sa se determine centrul de greutate al unui
>poligon oarecare ce
>are n varfuri (n<=10000). (acm central european
>region, olimpiada
>online)
http://www.faqs.org/faqs/graphics/algorithms-faq/

Tot acolo, se bazeaza pe formula ariei.


>24. Se dau n segmente (n<=100). Sa se determine o
>dreapta ce
>intersecteaza numarul maxim posibil de segmente.
>(lista [olimpiada])
Orice dreapta ce intersecteaza numarul maxim de
segmente poate fi translatata astfel incat sa
intersecteze acelasi numar de segmente dar sa aiba pe
ea o extremitate de segment, dupaia poate fi rotita sa
aiba inca o extremitate pe ea. Deci complexitate
O(n^3).
Se poate si in O(n^2 log n) cu ideea de sortare in
jurul punctului.
>25. Se dau doua multimi de n si m puncte (n,m<=300).
>Sa se determine o dreapta care separa aceste doua
>multimi. (baraj 98)
O dreapta de separare se poate translata pana cand
intalneste un varf al unui poligon. Acuma pt fiecare
punct se testeaza daca punctele din celalalt poligon
sunt in acelasi semiplan. Asta se face determinand
unghiul cu fiecare pct din celalalt poligon si se vede
daca diferenta intre cel mai mic si cel mai mare punct
ca unghi e <=180. (mai e de verificat si daca aceasta
dreapta determinata nu intersecteaza primul poligon)
>26. * Se da un poligon oarecare cu n varfuri
>(n<=1000). Se dau m puncte (m<=1000). Sa se determine
>care dintre puncte sunt interioare
>poligonului. (pregatire lot 99)
http://www.faqs.org/faqs/graphics/algorithms-faq/
>27. *** Se da un poligon convex cu n varfuri
>(n<=1000). Se dau m
>puncte (m<=100000). Sa se determine care dintre
>puncte sunt interioare poligonului. (balcaniada 99,
>cu date ca si la problema anterioara)
Se considera un vf al poligonului si fasciculele
determinate de punctu asta si cate 2 semidrepte ce
pleaca din el inspre cate 2 puncte consecutive de pe
poligon. Cu cautare binara se gaseste fascicolul in
care e fiecare punct si acuma mai ramane de verificat
daca punctul respectiv e interior triunghiului.
>28. *** Se da un poligon convex de n noduri
>(n<=10000) si m drepte
>(m<=10000). Sa se determine cate drepte intersecteaza
>poligonul. (baraj 98, ceoi 2002)
tot cautare binara
>29. * Se dau n puncte de coordonate intregi in plan,

>sa se determine numarul de puncte de coordonate


>intregi de pe contrulul poligonului, aria
>poligonului, si numarul de puncte de coordonate
>intregi interioare poligonului. (selectie acm Babes
>2003 :))
Parca ii zice formula lui pick la chestia ce am
folosit-o in concurs se gaseste in Probleme
neelementare tratate elementar (Iaglom, Iaglom).
Pt determinarea numarului de puncte de coordonate
intregio pe un segment cu capetele de coordonate
intregi se foloseste algoritmul lui Euclid.
>30. *** Se da un poligon convex cu n varfuri
>(n<=10000) de coordonate reale intre 0 si 30000. Sa
>se determine numarul de puncte de coordonate intregi
>din interiorul poligonului. (eu am vazut-o pe
>lista lui Francu, dar cred ca e si pe acm.timus.ru)
O(n)
>31. *** Se dau n puncte (n<=1000) intr-un dreptunghi.
>Sa se determine dreptunghiul de arie maxima continut
>in dreptunghiul initial cu laturile paralele cu cele
>ale dreptunghiului initial, care nu contine nici un
>punct in interior. (El Judge, UVA, CEOI 96
>sau 97)
O(n^2) poate va explica csibi sau adi.
O sa mai lucrez la mailu asta sa le redactez mai
bine. Daca aveti idei noi sau corecturi var rog
trimiteti-mi.
Salut,
Cosmin

S-ar putea să vă placă și