Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Răspuns: 007 Arbori de intervale  (Citit de 6179 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
alexjj
Vizitator
« : Noiembrie 17, 2004, 19:42:04 »

Question : Cum modific algoritmul de determinare a sumei dintre doua pozitii a unui vector (care foloseste evident arbori de intervale) ca sa calculez minimul ?. (Mentionez ca nu vreau sa mi sa raspunda cu USE RMQ, e pe info.devnet).

Thank you for reading this !
Memorat
wickedman
Echipa infoarena
Nu mai tace
*****

Karma: 227
Deconectat Deconectat

Mesaje: 670



Vezi Profilul WWW
« Răspunde #1 : Noiembrie 17, 2004, 22:19:38 »

Daca ai nevoie de minim intre 1 si X poti folosi foarte usor AIB.
Daca iti trebuie intre i si j trebuie sa modifici foarte putin algoritmul ce determina suma dintre doua pozitii (care, btw. se poate face mult mai simplu cu AIB  wink ).

evident, actualizarea se va face ceva de genu`:
Cod:
info[x] = min(info[left], info[right])


acolo unde calculezi sumele, in loc sa zici
Cod:
suma += info[x]

vei zice
Cod:
minim = min(minim, info[x])
Memorat
alexjj
Vizitator
« Răspunde #2 : Noiembrie 18, 2004, 20:18:24 »

multzam trebuie sa incerc (si trebuie sa mearga).
Memorat
alexjj
Vizitator
« Răspunde #3 : Noiembrie 20, 2004, 10:49:19 »

pt. 1... x era simplu (presupun ca pt. asta era codul tau).
deci eu folosesc ceva de genu ' :

Citat

Arborele va fi pãstrat sub forma unui vector c în care
fiecare element i va conþine suma elementelor subsecvenþei
<i - 2k + 1, i>, unde k este numãrul zerourilor terminale din
reprezentarea binarã a lui i.


shi pseudocodul (pt. modificare ) :

Citat

• Se identificã poziþia elementului care trebuie modificat.
• Cât timp poziþia curentã este cel mult egalã cu dimensiunea
ºirului:
♦ Se modificã valoarea elementului de pe poziþia curentã.
♦ Se determinã numãrul k al zerourilor terminale din reprezentarea
binarã a poziþiei curente.
♦ Noua poziþie se determinã adunând valoarea 2^k la poziþia
curentã
etc..


dar vreau intre i shi j. shi nu-i dau de cap.
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #4 : Noiembrie 20, 2004, 13:01:33 »

Citat din mesajul lui: alexjj
pt. 1... x era simplu (presupun ca pt. asta era codul tau).
deci eu folosesc ceva de genu ' :

Citat

Arborele va fi pãstrat sub forma unui vector c în care
fiecare element i va conþine suma elementelor subsecvenþei
<i - 2k + 1, i>, unde k este numãrul zerourilor terminale din
reprezentarea binarã a lui i.


shi pseudocodul (pt. modificare ) :

Citat

• Se identificã poziþia elementului care trebuie modificat.
• Cât timp poziþia curentã este cel mult egalã cu dimensiunea
ºirului:
♦ Se modificã valoarea elementului de pe poziþia curentã.
♦ Se determinã numãrul k al zerourilor terminale din reprezentarea
binarã a poziþiei curente.
♦ Noua poziþie se determinã adunând valoarea 2^k la poziþia
curentã
etc..


dar vreau intre i shi j. shi nu-i dau de cap.


Tu nu faci arbori de intervale, ci arbori indexati binari (cauta in GInfo despre asta sau in handbook-ul de la IOI 2001). Aceasta structura de date poate fi folosita doar pentru suma dintre i si j (Suma[1..j] - Suma[1..i-1]) , nu si pentru minime/maxime. Daca vrei minim/maxim dintre i si j citeste documentul de arbori de intervale din sectiunea Download (a fost curs la lot anul trecut).
Memorat
alexjj
Vizitator
« Răspunde #5 : Noiembrie 20, 2004, 15:44:33 »

multzumesc. materialul citat e din Ginfo shi scria acolo ca operatie de adunare poate fi inlocuita cu minim, maxim etc. ; nu m-am facut clar de la inceput cu arbori indexati binari (sorry).
nici eu nu credeam ca e posibil.
Memorat
wickedman
Echipa infoarena
Nu mai tace
*****

Karma: 227
Deconectat Deconectat

Mesaje: 670



Vezi Profilul WWW
« Răspunde #6 : Noiembrie 20, 2004, 20:01:27 »

Citat din mesajul lui: alexjj
multzumesc. materialul citat e din Ginfo shi scria acolo ca operatie de adunare poate fi inlocuita cu minim, maxim etc. ; nu m-am facut clar de la inceput cu arbori indexati binari (sorry).
nici eu nu credeam ca e posibil.


asa cum a recunoscut si autorul intr`o intrebare care i-a fost adresata direct de un prieten de al meu, acea precizare este eronata.
min(i, j) nu se poate face cu AIB (sau inca nu stie nimeni).
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines