•Marius
|
 |
« : Octombrie 03, 2007, 16:04:57 » |
|
http://acm.timus.ru/problem.aspx?space=1&num=1553Se poate mai bine de O(sqrt h) pe query si O(1) pe update ? h e inaltimea arborelui. Ideea mea a fost sa folosesc ideea determinarii LCAului in O(sqrt h).  Fiecare nod contine valoarea sa care se poate modifica la un update iar altele retin valoarea maxima dintre toate nodurile situate intre Level(x) + 1 si Level(x) + sqrt h. Pentru query merg in "sus" pana ajung la LCA, totul in 3 * sqrt h pasi.
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•Cosmin
|
 |
« Răspunde #1 : Octombrie 03, 2007, 20:46:48 » |
|
Poti sa faci log n pe update si log n pe query sau log^2 n pe query. Imparti arborele in lanturi cu heavy path decomposition: e o procedura recursiva ce gaseste un lant care porneste de la radacina arborelui si merge inspre fiul care e radacina unui subarbore cu numarul cel mai mare de noduri, dupa ce ai ajuns in o frunza, aplici procedura recursiv pe ceilalti arbori ramasi. Dupa ce ai impartit arborele in lanturi, pentru a merge pana in radacina dintr-un nod trebuie sa treci prin maxim log n lanturi diferite. Pe fiecare lant faci un range query. Asa rezolvi problema cu O(log^2 n) timp pe query, si parca daca folosesti biased finger trees iese O(log n) pe query.
|
|
« Ultima modificare: Octombrie 03, 2007, 21:54:27 de către Cosmin Negruseri »
|
Memorat
|
|
|
|
•domino
|
 |
« Răspunde #2 : Octombrie 03, 2007, 20:48:34 » |
|
Sigur poti face O(1) pe update la treaba cu sqrt() ?
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #3 : Octombrie 04, 2007, 08:51:32 » |
|
Un caz nasol ar fi un arbore stea cu o radacina si n - 1 fii. Daca faci update la radacina e clar ca trebuie sa faci update la mai mult de O(1) valori.
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #4 : Octombrie 05, 2007, 19:20:13 » |
|
Sigur poti face O(1) pe update la treaba cu sqrt() ?
Nu, nu e bine. Nu gasesc nimic pe internet sa ma ajute sa inteleg heavy path decomposition. Rog pe oricine are ceva material sa mi-l ofere si mie.
|
|
« Ultima modificare: Octombrie 05, 2007, 20:38:50 de către Marius Stroe »
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•domino
|
 |
« Răspunde #5 : Octombrie 05, 2007, 21:01:16 » |
|
Vezi www.cs.sunysb.edu/~bender/pub/latin02-level.ps , solutia <O(n), O(lg n)>. Acolo e longest path decomposition, dar e acelasi lucru pt heavy (daca nu ma insel, heavy inseamna sa alegi subarborele cu cel mai multe noduri la fiecare pas)
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #6 : Octombrie 06, 2007, 22:27:41 » |
|
Multumesc. Aproape am reusit. Un TLE pe la testul 25. Sa mearga mai repede cu long path (ladder) decat cu heavy path decomposition ?
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•Cosmin
|
 |
« Răspunde #7 : Octombrie 07, 2007, 05:54:09 » |
|
nu cred ca trebuie sa scrii diferit ... eventual da un paste la cod sa ma uit peste el si sa vedem ce poate fi imbunatatit.
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #8 : Octombrie 07, 2007, 20:03:38 » |
|
Nu mai e nevoie. Am reusit sa o scot in 1.1 s si 360 linii de cod. Multumesc inca o data pentru ajutor.
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•domino
|
 |
« Răspunde #9 : Octombrie 07, 2007, 20:29:34 » |
|
Ai facut ceva special ca sa mearga asa repede?
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #10 : Octombrie 07, 2007, 21:03:08 » |
|
Doar am optimizat codul: am parsat citirea, iar pentru alocarea grafului si a arborilor de intervale pentru fiecare path am folosit zone dintr-un tablou "mare" declarat la inceputul programului. Pentru lca raspund in O(1) cu preprocesare in O(N log N).
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•mugurelionut
|
 |
« Răspunde #11 : Noiembrie 12, 2007, 19:53:13 » |
|
O problema asemanatoare este http://www.spoj.pl/problems/QTREE/, de pe SPOJ, doar ca aici se schimba costul unei muchii, nu cel al unui nod. De curiozitate, heavy path decomposition e o tehnica cunoscuta prin comunitatea informaticienilor de pe la noi ?  Eu, personal, abia am "descoperit-o" acum vreo luna si un pic, pornind de la alte chestii [ conceptul de "path separator" ], dar mi se pare o idee foarte misto 
|
|
|
Memorat
|
|
|
|
•domino
|
 |
« Răspunde #12 : Noiembrie 12, 2007, 21:12:03 » |
|
O problema asemanatoare este http://www.spoj.pl/problems/QTREE/, de pe SPOJ, doar ca aici se schimba costul unei muchii, nu cel al unui nod. De curiozitate, heavy path decomposition e o tehnica cunoscuta prin comunitatea informaticienilor de pe la noi ?  Eu, personal, abia am "descoperit-o" acum vreo luna si un pic, pornind de la alte chestii [ conceptul de "path separator" ], dar mi se pare o idee foarte misto  Eu stiam de anul trecut de chestia asta de la Cosmin, si cred ca mai stiu cativa oameni de atunci.
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #13 : Noiembrie 13, 2007, 07:46:06 » |
|
Hmm, eu stiam de astea de cand era discutia cu level ancestor pe lista lu Francu prin 2003 sau 2004. Ca atunci am citit tot ce am prins legat de asta, dar QTREE e prima problema pe care am aplicat treaba cu descompunerea arborelui.
|
|
|
Memorat
|
|
|
|
|