Afişează mesaje
|
Pagini: [1] 2
|
1
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 250 Drumuri2
|
: Aprilie 28, 2016, 14:34:28
|
Mentionez pentru cine e interesat ca problema se poate reduce la min path cover cu noduri disjuncte intr-un DAG, care poate fi rezolvata cu cuplaj maxim ( https://en.wikipedia.org/wiki/Maximum_flow_problem#Minimum_path_cover_in_directed_acyclic_graph). Reducerea consta in inlocuirea grafului initial cu un graf cu aceleasi noduri, dar muchii orientate x -> y in cazul in care exista un drum de la nodul x la nodul y in graful initial. Pentru a demonstra ca cele 2 probleme sunt echivalente e suficient sa aratam ca orice solutie pe graful initial e o solutie pe graful nou si viceversa. Daca exista o solutie cu un set de drumuri pe graful initial, poate fi transformat intr-o solutie pe graful nou (fara noduri duplicate) sarind nodurile care au fost vizitate deja (muchiile necesare pt "sarituri" exista din constructie). Pe exemplul problemei: 1 -> 2 -> 3 -> 5 ar ramane tot 1 -> 2 -> 3 -> 5 in graful nou 7 -> 2 -> 4 -> 6, ar deveni:7 -> 4 -> 6 (am sarit nodul 2 fiindca a fost deja vizitat + muchia 7 -> 4 exista din constructie) Invers, daca exista o acoperire in graful nou, poate fi transformat intr-o solutie pt graful initial inlocuind fiecare muchie x -> y, cu toate nodurile coresp drumului de la x la y.
|
|
|
2
|
infoarena - concursuri, probleme, evaluator, articole / AGM 2016 / Răspuns: Arcas
|
: 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.
|
|
|
7
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1197 Mess
|
: Aprilie 25, 2013, 21:30:12
|
Poti pleca de la reprezentarea unui arbore de intervale. Un nod dintr-un arbore de intervale caracterizeaza un interval, (st, dr) sa zicem. Acum sa presupunem ca iti mentii urmatoarele informatii pt fiecare astfel de nod: 1) o lista cu valorile din intervalul (st, dr) in ordine crescatoare. Aceasta lista se poate obtine prin interclasarea listelor fiilor acelui nod. Avand in vedere ca fiecare valoare apare in log N noduri, complexitatea dpdv al memoriei cat si al timpului este N log N la pasul asta. 2) conceptual vei mentine o alta lista de lungime nr de noduri, unde pe pozitia i, ai 1 daca valoarea i(in ordinea sortata de mai sus) e online, 0 altfel. Avand in vedere tipurile de operatii pe care vrei sa le executi, defapt iti vei mentine un aib de lungime tot nr de noduri care este construit pe baza listei de care spuneam. Pt stocarea acestor aib-uri este necesara de asemenea, tot N log N memorie. Cu aceste informatii, poti sa aplici acum operatiile date in felul urmator: Operatie de tip 1: Vei trece prin cele log N noduri din arborele de intervale care contin nodul p din enunt si le vei actualiza aib-ul asociat. Deci log ^ 2 N / operatie de acest tip Operatie de tip 2: Vei descompune intervalul (p, q) in log N noduri. Acum cauti binar rezultatul printre cele N valori posibile(presupunand ca mai ai o lista cu valorile initiale sortate in ordine crescatoare). Pt o anumita valoare, verificarea se poate face folosind structura de aib, in log (lungime nod) pt fiecare nod. Complexitatea teoretica e in cazul asta log ^ 3 N, dar se comporta destul de bine. Bafta!
|
|
|
10
|
infoarena - concursuri, probleme, evaluator, articole / Code Pandas / Răspuns: Cercetatori
|
: Aprilie 05, 2013, 10:56:39
|
Pe exemplu, daca la t = 90, corpul 2 se afla in (1, 2), corpul 3 care orbiteaza in jurul lui nu ar trb sa se afle la (1, 3) ?
|
|
|
14
|
Comunitate - feedback, proiecte si distractie / Blog / Răspuns: Buguri la concursurile de programare si nu numai
|
: Martie 18, 2012, 19:03:01
|
3 sfaturi care mi-ar fi fost utile daca le-as fi aplicat: 1) Cititi cu atentie problemele a.i. cerinta sa fie clara. Puneti intrebari daca sunteti nesiguri 2) Cel mai important e sa salvati problemele unde/cum trebuie. Degeaba munciti la probleme,daca le salvati prost. O greseala aparent nesemnificativa cum ar fi confundarea unui "o" cu un "0", dupa cum am experimentat si eu, va conduce cu siguranta la un punctaj rotund de 0 puncte. 3) Verificati tot timpul memoria folosita. Chiar daca memoria disponibila pare arhisuficienta, este de preferat sa verificati. Eu am reusit sa busesc memoria la o problema de la oni anul trecut la care erau 128 mb disponibili. Succes!
|
|
|
24
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 215 Numar
|
: Ianuarie 04, 2011, 01:36:15
|
Gandeste-te ca daca ai un nr impar de termeni consecutivi ei pot fi scrisi: x-k,...,x-1,x,x+1,...,x+k.Suma lor o sa fie (2k+1)x.Deci poti cauta x printre divizorii lui n. Asemanator si daca ai nr par de termeni: x-(2k-1)/2,...,x-1/2,x+1/2,...x+(2k-1)/2.Suma lor este 2k*x.
|
|
|
|