SlideShare ist ein Scribd-Unternehmen logo
1 von 4
Downloaden Sie, um offline zu lesen
Geometrie Computationala
Baleiere si Infasuratoare Convexa
Centru de pregatire pentru performanta „Hai la Olimpiada” Suceava
disciplina informatica
autor: Airinei Andrei Cristian
Baleiere (engl. Sweeping Line ~ maturare cu o linie), e o tehnica de
scanare a planului.
Ea consta in „maturarea” planului cu ajutorul unei drepte ( ea e doar
conceptual mutata), in general prin adaugarea acestora intr-o structura de
date la detectarea lor si eliminarea cand linia imaginara paraseste cadrul
obiectului.
Baleiere Orizontala / Verticala consta in deplasarea dreptei:
O sa dau 3 exemple, destul de cunoscute dar care suprind metoda
Problema 1: Se dau N puncte in plan , gasiti perechea care este cea mai
apropiata (din punct de vedere al distantei pe o coordonata min dintre abs(xi-
xj) , abs(yi, - yj)):
Cum facem in O(n2
) ? Putem mai bine?
Exista vreo pereche dintre cele 3 puncte din imagine pentru care nu are sens sa
calculam distanta, deoarece sigur nu ne duce la solutie?
Problema 2:
Se dau N segmente in plan date prin x y1 y2 pentru cele verticale, si prin y x1
x2 pentru cele verticale, se garanteaza ca nu exista doua segmente care se
suprapun, Aflati numarul de intersectii intre segmente.
Cum facem O(n2
)? Cum calculam daca doua segmente se intersecteaza?
Folosind aceiasi idee de baleiere verticala(sau orizontala) in ce structura de
date putem retine segmentele astfel incat sa putem raspunde si la cerinta
problemei?
Daca coordonatele sunt foarte mari ce facem?
Bonus: idee de o normalizare suficient de rapida si scurta, punem tot ce vrem
sa normalizam intr-un vector, il sortam si scoatem duplicatele dupa cautam
binar (din fericire STL stie sa faca asta in vreo 3 randuri):
1. sort(all.begin(), all.end());
2. all.erase(unique(all.begin(), all.end(),same),all.end());
3. //norma(x) valoarea normalizata a lui x
4. int norma(point val)
5. {
6. auto it = lower_bound(all.begin(), all.end(),val);
7. return distance(all.begin(),it) + 1;
8. // +1 pentru normalizare indexata de la 1
9. }
Problema 3: (destul de greu)
Se dau N dreptunghiuri in plan avand laturile paralele cu axele, aflati aria
reuniunii lor?
Cum rezolvam problema fara baleiere? Ce complexitate avem?
Baleiere Radiala: in loc sa deplasam dreapta intr-o directie fixa, o rotim
Cum arata conditia de sortare pentru asa ceva? Cum evitam problemele?
(aria unui poligon)
Problema:
https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F
Infasuratoare Convexa: (convex hull)
Dandu-se un set de N puncte in plan, sa se determine poligonul convex de arie
minima care are in interiorul lui sau pe margini toate punctele date. Poligonul
astfel obtinut se numeste infasuratoarea convexa a celor N puncte.
Scanare Graham:
La pasul i, cand examinam al i−lea punct, este posibil ca adaugarea acestuia sa formeze o
concavitate cu punctul din varful stivei. Prin urmare vom scoate din varful stivei puncte
pana cand punctul nou adaugat nu va mai forma nicio concavitate. In final punctele
ramasein stiva formeaza un poligon convex.
Complexitatea algoritmului este O(n · logn) datorita sortarii. Procesarea punctelor in sine
are complexitate O(n), deoarece fiecare punct este adaugat ın stiva exact o data siextras din
stiva cel mult o data.
https://en.wikipedia.org/wiki/File:GrahamScanDemo.gif  animatie
Baleiere :
https://codingcompetitions.withgoogle.com/kickstart/round/00000000004362d6/0000000
0008b3a1c usoara
https://www.pbinfo.ro/probleme/930/intersectiesegmente medie
https://www.pbinfo.ro/probleme/3772/jocculasere intersectii segmente ++
https://codeforces.com/contest/1569/problem/D grea
https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F ( cred ca trebuie sa
intrati intai aici https://codeforces.com/group/XKti6Uyw1n/contests ca sa dati submit)
Convex Hull:
https://www.infoarena.ro/problema/infasuratoare -- problema clasica
https://infoarena.ro/problema/mosia -- ceva mai greu
Articol foarte bun:
https://www.topcoder.com/thrive/articles/Line%20Sweep%20Algorithms
O alta tehnica utila: https://codeforces.com/blog/entry/63823
Tot in spiritul geometriei, fara a se lega neaparat de vreo tehnica prezentata anterior:
Nu neaparat ceva de olimpiada dar un exercitiu de geometrie
https://catcoder.codingcontest.org/training/501/play --> beat and AI at pong, daca aveti
nevoie de ajutor sa rulati simulatorul puteti sa imi dati mesaj

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (7)

Coding io1-materials for students-group3 ro
Coding io1-materials for  students-group3 roCoding io1-materials for  students-group3 ro
Coding io1-materials for students-group3 ro
 
Grafuri curs
Grafuri curs Grafuri curs
Grafuri curs
 
Desenarea 3 d
Desenarea 3 dDesenarea 3 d
Desenarea 3 d
 
Tablouri bidimensionale
Tablouri bidimensionaleTablouri bidimensionale
Tablouri bidimensionale
 
Proiect nr complexe (1)
Proiect nr complexe (1)Proiect nr complexe (1)
Proiect nr complexe (1)
 
Vectori
VectoriVectori
Vectori
 
Tipul tablou
Tipul tablouTipul tablou
Tipul tablou
 

Ähnlich wie Gc baleiere _infasuratoare_convexa (2)

Ähnlich wie Gc baleiere _infasuratoare_convexa (2) (9)

Opt
OptOpt
Opt
 
Metoda backtracking(1)
Metoda backtracking(1)Metoda backtracking(1)
Metoda backtracking(1)
 
RH
RHRH
RH
 
Metoda reluării
Metoda reluăriiMetoda reluării
Metoda reluării
 
Calculul numeric teorie
Calculul numeric teorieCalculul numeric teorie
Calculul numeric teorie
 
X matematica (in limba romana)
X matematica (in limba romana)X matematica (in limba romana)
X matematica (in limba romana)
 
Auxiliar clasa v
Auxiliar clasa vAuxiliar clasa v
Auxiliar clasa v
 
integrare
integrareintegrare
integrare
 
Prelegere1Concepte generale ale graficii pe calculator
Prelegere1Concepte generale ale graficii pe calculatorPrelegere1Concepte generale ale graficii pe calculator
Prelegere1Concepte generale ale graficii pe calculator
 

Gc baleiere _infasuratoare_convexa (2)

  • 1. Geometrie Computationala Baleiere si Infasuratoare Convexa Centru de pregatire pentru performanta „Hai la Olimpiada” Suceava disciplina informatica autor: Airinei Andrei Cristian Baleiere (engl. Sweeping Line ~ maturare cu o linie), e o tehnica de scanare a planului. Ea consta in „maturarea” planului cu ajutorul unei drepte ( ea e doar conceptual mutata), in general prin adaugarea acestora intr-o structura de date la detectarea lor si eliminarea cand linia imaginara paraseste cadrul obiectului. Baleiere Orizontala / Verticala consta in deplasarea dreptei: O sa dau 3 exemple, destul de cunoscute dar care suprind metoda Problema 1: Se dau N puncte in plan , gasiti perechea care este cea mai apropiata (din punct de vedere al distantei pe o coordonata min dintre abs(xi- xj) , abs(yi, - yj)): Cum facem in O(n2 ) ? Putem mai bine?
  • 2. Exista vreo pereche dintre cele 3 puncte din imagine pentru care nu are sens sa calculam distanta, deoarece sigur nu ne duce la solutie? Problema 2: Se dau N segmente in plan date prin x y1 y2 pentru cele verticale, si prin y x1 x2 pentru cele verticale, se garanteaza ca nu exista doua segmente care se suprapun, Aflati numarul de intersectii intre segmente. Cum facem O(n2 )? Cum calculam daca doua segmente se intersecteaza? Folosind aceiasi idee de baleiere verticala(sau orizontala) in ce structura de date putem retine segmentele astfel incat sa putem raspunde si la cerinta problemei? Daca coordonatele sunt foarte mari ce facem? Bonus: idee de o normalizare suficient de rapida si scurta, punem tot ce vrem sa normalizam intr-un vector, il sortam si scoatem duplicatele dupa cautam binar (din fericire STL stie sa faca asta in vreo 3 randuri): 1. sort(all.begin(), all.end()); 2. all.erase(unique(all.begin(), all.end(),same),all.end()); 3. //norma(x) valoarea normalizata a lui x 4. int norma(point val) 5. { 6. auto it = lower_bound(all.begin(), all.end(),val); 7. return distance(all.begin(),it) + 1; 8. // +1 pentru normalizare indexata de la 1 9. } Problema 3: (destul de greu) Se dau N dreptunghiuri in plan avand laturile paralele cu axele, aflati aria reuniunii lor? Cum rezolvam problema fara baleiere? Ce complexitate avem? Baleiere Radiala: in loc sa deplasam dreapta intr-o directie fixa, o rotim Cum arata conditia de sortare pentru asa ceva? Cum evitam problemele?
  • 3. (aria unui poligon) Problema: https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F Infasuratoare Convexa: (convex hull) Dandu-se un set de N puncte in plan, sa se determine poligonul convex de arie minima care are in interiorul lui sau pe margini toate punctele date. Poligonul astfel obtinut se numeste infasuratoarea convexa a celor N puncte. Scanare Graham: La pasul i, cand examinam al i−lea punct, este posibil ca adaugarea acestuia sa formeze o concavitate cu punctul din varful stivei. Prin urmare vom scoate din varful stivei puncte pana cand punctul nou adaugat nu va mai forma nicio concavitate. In final punctele ramasein stiva formeaza un poligon convex. Complexitatea algoritmului este O(n · logn) datorita sortarii. Procesarea punctelor in sine are complexitate O(n), deoarece fiecare punct este adaugat ın stiva exact o data siextras din stiva cel mult o data. https://en.wikipedia.org/wiki/File:GrahamScanDemo.gif  animatie Baleiere : https://codingcompetitions.withgoogle.com/kickstart/round/00000000004362d6/0000000 0008b3a1c usoara https://www.pbinfo.ro/probleme/930/intersectiesegmente medie https://www.pbinfo.ro/probleme/3772/jocculasere intersectii segmente ++ https://codeforces.com/contest/1569/problem/D grea https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F ( cred ca trebuie sa intrati intai aici https://codeforces.com/group/XKti6Uyw1n/contests ca sa dati submit) Convex Hull: https://www.infoarena.ro/problema/infasuratoare -- problema clasica https://infoarena.ro/problema/mosia -- ceva mai greu
  • 4. Articol foarte bun: https://www.topcoder.com/thrive/articles/Line%20Sweep%20Algorithms O alta tehnica utila: https://codeforces.com/blog/entry/63823 Tot in spiritul geometriei, fara a se lega neaparat de vreo tehnica prezentata anterior: Nu neaparat ceva de olimpiada dar un exercitiu de geometrie https://catcoder.codingcontest.org/training/501/play --> beat and AI at pong, daca aveti nevoie de ajutor sa rulati simulatorul puteti sa imi dati mesaj