|
•APOCALYPTO
|
|
« Răspunde #1 : Noiembrie 14, 2009, 18:40:07 » |
|
in aceste teste exista si coordonate negative??? teoretic ar trebui. practic mi se pare ca nu pentru ca pe aceiasi sursa doar cum modificarea output-ului pe infoarena iau 100 iar pe campion 60 restrictiile sunt cam la fel
|
|
|
Memorat
|
|
|
|
•wefgef
|
|
« Răspunde #2 : Noiembrie 15, 2009, 00:16:08 » |
|
Ai acces liber la teste, poti sa te uiti daca vrei.
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•philip
Strain
Karma: 5
Deconectat
Mesaje: 39
|
|
« Răspunde #3 : Noiembrie 17, 2009, 14:53:24 » |
|
In sursa data ca exemplu pentru al doilea algoritm (scanarea Graham) e folosita o functie "semn" care calculeaza daca unghiul format de 3 puncte este mai mare sau mai mic de 180 de grade: long double semn(int i1,int i2,int i3) { return (long double)X[i1] * Y[i2] + X[i2] * Y[i3] + X[i3] * Y[i1] - Y[i1] * X[i2] - Y[i2] * X[i3] - Y[i3] * X[i1]; }
Cum s-a ajuns la aceasta formula?
|
|
|
Memorat
|
|
|
|
•Mishu91
|
|
« Răspunde #4 : Noiembrie 17, 2009, 15:30:56 » |
|
Acea "formulă" este defapt dublul ariei triunghiului format de cele 3 puncte, însă în cazul de față te interesează doar semnul. Acea arie se calculează cu ajutorul determinanților.
|
|
|
Memorat
|
|
|
|
•philip
Strain
Karma: 5
Deconectat
Mesaje: 39
|
|
« Răspunde #5 : Noiembrie 17, 2009, 15:41:35 » |
|
Acea "formulă" este defapt dublul ariei triunghiului format de cele 3 puncte, însă în cazul de față te interesează doar semnul. Acea arie se calculează cu ajutorul determinanților.
Mersi, am inteles. E ca si la calcularea convexitatii unui poligon cu ajutorul determinantilor, luand cate 3 varfuri consecutive.
|
|
|
Memorat
|
|
|
|
•cosgb
Strain
Karma: 0
Deconectat
Mesaje: 6
|
|
« Răspunde #6 : Noiembrie 21, 2009, 01:29:26 » |
|
am o mare problema...am trimis sursa am luat niste timpi ff mari asa ca am luat primele 2 teste si am testat-o acasa in c++ ca sa vad timpul... spre surprinderea mea timpii au fost in jur de 4 ms(raspunsurile de asemenea corecte), dar pe infoarena iau TLE la primul test si SIGCEV la al 2-lea test(restul testelor nu le-am verificat cert e ca pt toate imi iese din timp sau iau SIGCEV, dar primele 2 mie imi merg acasa). Nu inteleg din ce cauza patesc asta(ultima sursa trimisa e cea buna, de fapt e identica cu prima, restul sunt diferite). Ma poate ajuta cineva? (ultima sursa daca se poate uita cineva pe ea) [edit] mi-am dat seama ce e gresit :p am ceva la quicks sort . mai ramane sa corectez aia ) [editat de admin] Nu posta consecutiv, foloseste butonul "modifica"!
|
|
« Ultima modificare: Noiembrie 21, 2009, 16:06:31 de către Paul-Dan Baltescu »
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #7 : Noiembrie 24, 2009, 12:58:42 » |
|
Vroiam sa intreb de ce e nevoie sa luam cel mai de jos (cel mai din stanga) punct daca folosim scanarea Graham... dar in timp ce formulam intrebarea mi-am dat seama ca trebuie ca primul punct din stiva sa fie sigur pe infasuratoare.Daca e asa inseamna ca putem lua si cel mai de sus punct(cel mai din stanga),cel mai de sus (cel mai din dreapta) si toate combinatiile astea(in principiu extremitatiile)... asa e? LE Am inteles .ms
|
|
« Ultima modificare: Noiembrie 25, 2009, 11:03:56 de către Tarca Bogdan »
|
Memorat
|
|
|
|
•sima_cotizo
|
|
« Răspunde #8 : Noiembrie 24, 2009, 17:31:40 » |
|
Practic tu rotesti planul, deci poti sa il iei si pe cel mai "de jos" pe o directie care face 43 de grade cu orizontala, iar apoi pe cel mai "din stanga" pe o directie perpendiculara pe prima. Daca faci ajustarile necesare, da, merge.
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #9 : Ianuarie 27, 2010, 09:52:59 » |
|
Si daca ar fi puncte coliniare, cum realizez sortarea? Eu folosesc functia inline int cmp(p a,p b) { long double A=(b.x-Min.x)*(a.y-Min.y); long double B=(a.x-Min.x)*(b.y-Min.y); return A<B||(A==B&&(a.x<b.x||a.x==b.x&&a.y<b.y)); } dar nu merge. Daca avem * * * * * * * le sorteaza bine pe cele de jos (coliniare) insa cele coliniare de pe verticala sunt luate de jos in sus si ar trebui de sus in jos. Eu incerc sa formez un poligon.Intrebarea e cum ordonez punctele intr'un sens(trigonometric sau invers)?
|
|
|
Memorat
|
|
|
|
•sima_cotizo
|
|
« Răspunde #10 : Ianuarie 27, 2010, 10:55:13 » |
|
Ce algoritm folosesti?
In cazul algoritmului care se foloseste de o stiva (parca se numea scanare Graham), nu conteaza foarte mult daca mergi trigonometric sau nu. In acea functie de testare de "intoarcere la stanga/dreapta" (pe care o faci cu produs vectorial) doar schimbi sensul unei inegalitati. Totusi, cred ca nu exista o "regula" pentru ce vrei tu, ar trebui facuta o tratare separata. Poti insa in caz de puncte coliniare pe laturi sa le iei doar pe cele mai departate (capetele practic) in infasuratoare si atunci cand sortezi trigonometric (sau in sens invers) mai folosesti si un test de "distanta" (punctele cele mai departate de punctul de referinta sa fie primele). Sper sa nu ma insel...
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #11 : Ianuarie 27, 2010, 11:10:40 » |
|
Nu imi trebuia pentru problema asta. Pur si simplu sa sortez in sens trigonometric. Ideea cu distanta pare buna. O sa implementez imediat si revin cu rezultatu:D. Nu am voie sa elimin varfuri din poligon. LE: faza cu distanta nu merge fiindca pentru punctele de jos coliniare imi trebuie sortate in ordine crescatoare(in functie de distanta) iar cele de pe verticala in ordine descrescatoare:D Mie imi trebuie pt problema mosia, dar mi s-a parut mai bine sa postez aici. Deci fiind date n puncte, cum le ordonez in sensul acelor de ceasornic sau invers .Punctele formeaza un poligon convex.
|
|
« Ultima modificare: Ianuarie 27, 2010, 11:17:46 de către Tarca Bogdan »
|
Memorat
|
|
|
|
•sima_cotizo
|
|
« Răspunde #12 : Ianuarie 27, 2010, 13:37:28 » |
|
LE: faza cu distanta nu merge fiindca pentru punctele de jos coliniare imi trebuie sortate in ordine crescatoare(in functie de distanta) iar cele de pe verticala in ordine descrescatoare:D
Nu cred ca e vorba de "pe verticala" ci "punctele de pe ultima latura a poligonului", fie ea verticala sau nu. Cat despre sortare in sens trigonometric in jurul unui punct "ref": 30.bool comp(point A, point B) { 31. double dx1 = A.x-ref.x, dx2 = B.x-ref.x; 32. double dy1 = A.y-ref.y, dy2 = B.y-ref.y; 33. return dx1*dy2 > dx2*dy1; // varianta: return atan2(dy1,dx1) > atan2(dy2,dx2); 34.}
Functia asta poate fi folosita cu sort() din STL. Codul l-am luat din sursa mea de la problema din arhiva, dar cred ca din orice sursa de 100 poti invata cate ceva
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #13 : Ianuarie 28, 2010, 09:58:06 » |
|
Pana la urma am luat cel mai de jos stanga punct din poligon,am adunat si la x si la y 0.0010007(ca sa nu mai fie coliniare cu celelalte) si am sortat in jurul acelui punct si a mers de 100 Functia ta e exact ca a mea... Dar nush cum ai luat 100, probabil ca ai luat ref un punct random din cele ale poligonului,dar daca se dadeau puncte astfel incat sa fie coliniare 3 cate 3 nu mai mergea. Inainte sa incerc ideea de mai sus am facut media aritmetica a tuturor punctelor si mai adaugam la x si la y un 0.0010007(...) dar am observat ca nu sorteaza bine. Mai pe scurt am luat un punct in interiorul poligonului si am sortat varfurile in jurul acelui punct. Ce ar fi gresit? Am folosit aceeasi functie de sortare.
|
|
|
Memorat
|
|
|
|
•sima_cotizo
|
|
« Răspunde #14 : Ianuarie 28, 2010, 19:15:35 » |
|
Functia ta e exact ca a mea... Dar nush cum ai luat 100, probabil ca ai luat ref un punct random din cele ale poligonului,dar daca se dadeau puncte astfel incat sa fie coliniare 3 cate 3 nu mai mergea.
Nu vor exista puncte coliniare pe infasuratoarea conexa. Asa am luat 100 la problema din arhiva educationala. Mai pe scurt am luat un punct in interiorul poligonului si am sortat varfurile in jurul acelui punct. Ce ar fi gresit? Am folosit aceeasi functie de sortare.
Nu poti face asta in Scanarea Graham. Trebuie sa incepi cu un punct care este obligatoriu pe infasuratoarea convexa si poti fii sigur ca cel mai din jos-stanga se afla acolo. La fel si cu sus-dreapta. In principiu primul punct nu poate fi scos din stiva si de aceea nu poti sa il folosesti pe unul din interiorul poligonului (asigura-te ca stapanesti modul de functionare al algoritmului ).
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #15 : Ianuarie 28, 2010, 20:16:42 » |
|
Nu ne prea intelegem ) "Mie imi trebuie pt problema mosia" am scris mai sus... Daca poti sa citesti inca o data ce am scris mai sus si ma poti ajuta ti-as ramane recunoscator:D
|
|
|
Memorat
|
|
|
|
•johsonsbabi
Strain
Karma: 2
Deconectat
Mesaje: 10
|
|
« Răspunde #16 : Februarie 04, 2010, 06:44:04 » |
|
salut. stie cineva ce trebuie adaugat la scanarea graham pentru a include in infasuratoare si punctele coliniare?
|
|
|
Memorat
|
|
|
|
•alexandru92
|
|
« Răspunde #17 : Februarie 04, 2010, 10:23:12 » |
|
semn( ... ) >= 0 // nu > cum e in sursa oficiala
Asta ar fi tot
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #18 : Februarie 04, 2010, 10:54:54 » |
|
>= scoti din stiva daca punctele formeaza o intoarcere la dreapta sau daca sunt coliniare > scoti din stiva doar daca punctele formeaza o intoarcerela dreapta Deci lasi cu > insa trebuie modificata sortarea
|
|
|
Memorat
|
|
|
|
•johsonsbabi
Strain
Karma: 2
Deconectat
Mesaje: 10
|
|
« Răspunde #19 : Februarie 04, 2010, 17:40:49 » |
|
da aveti dreptate, am incercat aia ieri dar este un caz particular. chick this intra : 8 0 -2 1 -1 2 0 1 1 0 2 -1 1 -2 0 -1 -1 el le sorteaza asa: 1(punct initial) 2 3 4 5 6 8 7iar cand el ajunge la 8 7 sa le bage in stiva, il baga prima data pe 8 pentru ca asa este in sortare!!!! iar dupa ce il baga pe 7 este aria pozivita si il scoate pe 8 si il baga pe 7 atentie in functie de cum fac sortarea... daca ii bag in functia de comparare a sortarii tg1 > tg2, se sorteaza unghiurile cu tg egala descrescator, iar daca pun tg1>=tg2 ,unghiurile cu tg egala se sorteaza crescator... astfel scap de problema de la 6 7 8 dar apare alta la 2 3 4
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #20 : Februarie 04, 2010, 18:08:38 » |
|
Problema asta o tot intrebam si eu pe forum dar nu mi-a raspuns nimeni... Pana la urma am dat eu de o kestie. iei primu punct(cel mai de jos stanga,sau oricare dp extremitate) si adaugi la x un 0.00010007 sau orice numar fff mic, iar la y adaugi la fel un numar random 0.00010003 de exemplu. Si bagi punctu asta in stiva si faci scanarea in mod normal si o sa mearga. daca poligonul este convex poti sa faci media aritmetica a tuturor punctelor(dupa x si dupa y) si sortezi asa int cmp(p x,p y) { return atan2(a.y-medie.y,a.x-medie.x)<atan2(b.y-medie.y,b.x-medie.x); }
|
|
|
Memorat
|
|
|
|
•johsonsbabi
Strain
Karma: 2
Deconectat
Mesaje: 10
|
|
« Răspunde #21 : Februarie 04, 2010, 18:22:53 » |
|
Problema asta o tot intrebam si eu pe forum dar nu mi-a raspuns nimeni... Pana la urma am dat eu de o kestie. iei primu punct(cel mai de jos stanga,sau oricare dp extremitate) si adaugi la x un 0.00010007 sau orice numar fff mic, iar la y adaugi la fel un numar random 0.00010003 de exemplu. Si bagi punctu asta in stiva si faci scanarea in mod normal si o sa mearga. daca poligonul este convex poti sa faci media aritmetica a tuturor punctelor(dupa x si dupa y) si sortezi asa int cmp(p x,p y) { return atan2(a.y-medie.y,a.x-medie.x)<atan2(b.y-medie.y,b.x-medie.x); }
am citit si posturile tale inainte sa postez eu, dar nu prea am inteles ce ai intrebat . in fine deci ca sa inteleg: adun la punctu inditial niste miimi si dupa fac sortarea? EDIT: da frate ms mult, esti super
|
|
« Ultima modificare: Februarie 04, 2010, 18:39:45 de către Johnsons Babi Minune »
|
Memorat
|
|
|
|
•Bogdan_tmm
|
|
« Răspunde #22 : Februarie 04, 2010, 18:57:42 » |
|
L.E. Vezi ca ti-am lasat un pm
|
|
« Ultima modificare: Februarie 04, 2010, 19:59:10 de către Tarca Bogdan »
|
Memorat
|
|
|
|
•johsonsbabi
Strain
Karma: 2
Deconectat
Mesaje: 10
|
|
« Răspunde #23 : Februarie 04, 2010, 19:17:13 » |
|
baga in`u asta si spunemi cate puncte iti intra in infasuratoare. (sunt coordonate naturale)
testul este ultimul de la problema cetati de pe campion.
raspunsul corect este 10000 (toate punctele fac parte din infasuratoare) mie imi ia in infasuratoare 5004. nu stiu de ce
|
|
|
Memorat
|
|
|
|
•alexandru92
|
|
« Răspunde #24 : Februarie 04, 2010, 20:23:42 » |
|
Pentru problema cetati de pe campion este suficient sa faci modificarea mentionata de mine mai sus
|
|
|
Memorat
|
|
|
|
|