Titlul: Arcas Scris de: Adrian Budau din Martie 26, 2016, 08:56:22 Aici se pot pune întrebări legate de problema Arcas (http://www.infoarena.ro/problema/arcas) de la concursului AGM 2016 (http://www.infoarena.ro/agm2016).
Titlul: Răspuns: Arcas Scris de: CNGrigoreMoisil din Martie 26, 2016, 09:48:59 Sageata se poate deplasa doar de jos in sus?
Titlul: Răspuns: Arcas Scris de: AGMInformatica din Martie 26, 2016, 09:54:16 "Acesta trage de M ori cu arcul din diferite pozitii reprezentate de perechea de coordonate (x,y) si cu puterea r, care semnifica faptul ca dupa ce sageata a trecut prin punctele (x,y), (x+1,y+1), (x+2,y+2),..., (x+r,y+r) acesta isi foloseste puterile si o face ca si disparuta"
Titlul: Răspuns: Arcas Scris de: Radu Toporan din Martie 26, 2016, 10:05:13 Tintele nu ar trebui sa fie paralele cu axa Ox?
Pe desen sunt paralele cu Oy. Titlul: Răspuns: Arcas Scris de: Stavarache Petru Eric din Martie 26, 2016, 10:10:31 " Mai exact, in plan se afla N tinte verticale reprezentate prin x, y1 si y2 cu semnificatia ca tinta se afla de la poztia (x,y1) la pozitia (x,y2) in plan. "
Titlul: Răspuns: Arcas Scris de: Radu Toporan din Martie 26, 2016, 11:28:24 Desenul trebuie rotiti la dreapta cu 90grade sa respecte enuntul.
Titlul: Răspuns: Arcas Scris de: AGMInformatica din Martie 26, 2016, 11:37:53 Desenul trebuie rotiti la dreapta cu 90grade sa respecte enuntul. Desenul este corect."Tintele sunt colorate cu maro, iar traiectoria sagetii este colorata cu rosu" Titlul: Răspuns: Arcas Scris de: CNGrigoreMoisil din Martie 26, 2016, 11:43:57 In enunt se spune ca "... aceasta dispare". Este vorba de sageata sau de tinta?
Titlul: Răspuns: Arcas Scris de: AGMInformatica din Martie 26, 2016, 11:51:29 De sageata.
Titlul: Răspuns: Arcas Scris de: Andrei Manea din Martie 29, 2016, 16:43:10 Problema se poate face in M*log(N) ? :)
Titlul: Răspuns: Arcas Scris de: Chichirim George din Martie 29, 2016, 17:35:57 Da, aceasta se poate face in M*log(N) atat offline cat si online.
Titlul: Răspuns: Arcas Scris de: Victor Teodor Stoian din Martie 30, 2016, 22:09:19 Imi poate explica cineva care este solutia oficiala? Eu am incercat sa sortez tinele dupa x si la fiecare query (tragere cu arcul) cautam binar in vector intre care tinte se afla x-ul actual, din care trag, iar daca y-ul tragerii + (x-ul tintei - x-ul tragerii) se afla in intervalul determinat de tinta, daca da inseamna ca sageata va zbura peste tina aia si trebuie contorizata si repetam asta pana cand x-ul tintei este mai mare decat x-ul tragerii+puterea tragerii. Insa imi da TLE pe 7 teste.
Titlul: Răspuns: Arcas Scris de: Patrick Sava din Martie 30, 2016, 23:44:16 Pentru fiecare tinta (x,y), faci o translatie. Cu alte cuvinte, fiecare tinta (x,y) va deveni (x,y-x). Acum sageata e aruncata orizontal si nu mai e inclinata la 45 de grade. Aceasta problema se poate cu smenul lui mars pe un arbore de intervale persistent sau cu o preprocesare offline a query-urilor.
Seara faina :D Titlul: Răspuns: Arcas Scris de: Carabet Cosmin Andrei din Martie 31, 2016, 18:18:39 Extinzand un pic explicatia lui Patrick cu o demonstratie care arata de unde vine solutia respectiva:
In principiu vrem sa determinam in ce conditii o "tragere" intersecteaza o "tinta". Unei tinte oarecare ii corespunde un triplet (x0, y0, y1), iar unei trageri un (x', y', r). Observam ca punctele de pe traiectoria tragerii sunt de forma (x' + r', y' + r'), 0 <= r' <= r. Pt a avea intersectie, trebuie ca (x' + r', y' + r') sa fie pe dreapta verticala (x0, y0, y1) corespunzatoare tintei, pt un 0 <= r' <= r (exista maxim o intersectie intra o dreapta transversala si una verticala) <=> exista 0 <= r' <= r, a.i: 1) x0 = x' + r' 2) y0 <= y' + r' <= y1 Observatie 1: singurul r' candidat este r' = x0 - x', care tb sa fie intre 0 si r. Inlocuind in a 2-a conditie avem: y0 <= y' + r' <= y1 <=> y0 <= y' + x0 - x' <= y1 <=> y0 - x0 <= y' - x' <= y1 - x0 Observatie 2: Avem 2 conditii pt intersectie: una la nivel de x si una la nivel de y dupa cum am vazut mai devreme. Conditia pt y nu depinde deloc de r', si implicit de r. Putem rescrie conditiile de mai devreme ca: 1) x' <= x0 <= x' + r 2) y0 - x0 <= y' - x' <= y1 - x0 De aici ne vine ideea de a ne creea un nou sistem de drepte a.i: a) "tinta" (x0, y0, y1) -> (x0, y0 - x0, y1 - x0) b) "tragerea" (x', y', r) -> (x', x' + r, y' - x') Astfel avem numai drepte orizontale si verticale ; iar o intersectie intre o dreapta verticala si una orizontala respecta conditiile 1) si 2). Aceasta problema este un exemplu clasic de line sweeping prezentat spre ex la https://www.topcoder.com/community/data-science/data-science-tutorials/line-sweep-algorithms/ sub sectiunea "line segment intersections". Se poate folosi intr-adevar un AIB + Smenul lui mars pt a numara numarul de intersectii intre "portiunea activa" si o dreapta verticala. Titlul: Răspuns: Arcas Scris de: Patrick Sava din Martie 31, 2016, 19:20:10 Extinzand un pic explicatia lui Patrick cu o demonstratie care arata de unde vine solutia respectiva: In principiu vrem sa determinam in ce conditii o "tragere" intersecteaza o "tinta". Unei tinte oarecare ii corespunde un triplet (x0, y0, y1), iar unei trageri un (x', y', r). Observam ca punctele de pe traiectoria tragerii sunt de forma (x' + r', y' + r'), 0 <= r' <= r. Pt a avea intersectie, trebuie ca (x' + r', y' + r') sa fie pe dreapta verticala (x0, y0, y1) corespunzatoare tintei, pt un 0 <= r' <= r (exista maxim o intersectie intra o dreapta transversala si una verticala) <=> exista 0 <= r' <= r, a.i: 1) x0 = x' + r' 2) y0 <= y' + r' <= y1 Observatie 1: singurul r' candidat este r' = x0 - x', care tb sa fie intre 0 si r. Inlocuind in a 2-a conditie avem: y0 <= y' + r' <= y1 <=> y0 <= y' + x0 - x' <= y1 <=> y0 - x0 <= y' - x' <= y1 - x0 Observatie 2: Avem 2 conditii pt intersectie: una la nivel de x si una la nivel de y dupa cum am vazut mai devreme. Conditia pt y nu depinde deloc de r', si implicit de r. Putem rescrie conditiile de mai devreme ca: 1) x' <= x0 <= x' + r 2) y0 - x0 <= y' - x' <= y1 - x0 De aici ne vine ideea de a ne creea un nou sistem de drepte a.i: a) "tinta" (x0, y0, y1) -> (x0, y0 - x0, y1 - x0) b) "tragerea" (x', y', r) -> (x', x' + r, y' - x') Astfel avem numai drepte orizontale si verticale ; iar o intersectie intre o dreapta verticala si una orizontala respecta conditiile 1) si 2). Aceasta problema este un exemplu clasic de line sweeping prezentat spre ex la https://www.topcoder.com/community/data-science/data-science-tutorials/line-sweep-algorithms/ sub sectiunea "line segment intersections". Se poate folosi intr-adevar un AIB + Smenul lui mars pt a numara numarul de intersectii intre "portiunea activa" si o dreapta verticala. Multumesc de ajutor ! Big up ! :thumbup: Seara faina ! :D Titlul: Răspuns: Arcas Scris de: Victor Teodor Stoian din Aprilie 01, 2016, 21:16:45 Multumesc mult, foarte faina ideea de rezolvare si desi am gasit care sunt criteriile sa se intersecteze nu mi-a dat prin cap sa transform sistemul :aha:
|