Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 1114 NumereX  (Citit de 2334 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« : Martie 27, 2011, 12:58:37 »

Aici puteti discuta despre problema NumereX.
Memorat

Am zis Mr. Green
avram_florin
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #1 : Martie 29, 2011, 17:26:25 »

Rog pe cineva sa imi dea si  mie un hint cum sa fac update-ul pe arbore ca nu inteleg cum sa optimizez! Smile Multumesc anticipat!
Memorat
Vman
Echipa infoarena
Vorbaret
*****

Karma: 45
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #2 : Martie 29, 2011, 18:54:31 »

atunci cand intervalul pe care faci update acopera complet intervalul din nodul in care te aflii faci update pt nodul respectiv si nu mai cobori in fii, altfel o sa ai tot O(N) pe update
Memorat
avram_florin
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #3 : Martie 29, 2011, 19:33:41 »

Am inteles ceea ce ai vrut sa spui,dar totusi ma incurc apoi la query.Asa cum am in exemplul dat,update pe intervalul[1,3] si apoi query pe intervalul[2,4].Tin sa mentionez ca sunt incepator in arborii de intervale. Very Happy
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #4 : Martie 29, 2011, 21:04:52 »

Deja ma dispera problema asta  Brick wall Si cu brute tot 0 puncte iau. WTF?
Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #5 : Martie 29, 2011, 22:58:14 »

Am inteles ceea ce ai vrut sa spui,dar totusi ma incurc apoi la query.Asa cum am in exemplul dat,update pe intervalul[1,3] si apoi query pe intervalul[2,4].Tin sa mentionez ca sunt incepator in arborii de intervale. Very Happy

Ideea e ca atunci cand ai un apel recursiv (query sau update) si ajungi intr-un nod asupra caruia s-a produs un update (cum ar fi in exemplul tau radacina subarborelui [1, 2]), sa actualizezi fii acestuia conform acestei valori inainte de a efectua apelurile recursive pentru fii. O problema la care este necesar acest truc este hotel. Ai putea sa incerci sa o rezolvi si pe aceasta ca exercitiu si, eventual, sa arunci o privire pe surse sa intelegi mai bine ideea.
Memorat

Am zis Mr. Green
andrei.12
Echipa infoarena
Nu mai tace
*****

Karma: 107
Deconectat Deconectat

Mesaje: 381



Vezi Profilul
« Răspunde #6 : Martie 29, 2011, 22:59:20 »

Citat
Deja ma dispera problema asta   Si cu brute tot 0 puncte iau. WTF?

Ai grija sa citesti datele corect Very Happy.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #7 : Martie 30, 2011, 19:25:31 »

Cod:
for(i=1;i<=M;i++)
{
scanf("%lld",&c);
if(c==0)
{
scanf("%lld %lld %lld",&S,&D,&x);
for(j=S;j<=D;j++)
A[j]=A[j]+x*(j-S+1);
}
else
{
scanf("%lld %lld",&S,&D);
R=0;
for(j=S;j<=D;j++)
R=R+A[j];
printf("%lld\n",R);
}
}
Mai simplu de atat nici ca se poate  Brick wall TOATE variabilele declarate long long. Am incercat si citire cu stream si sa trimit cu assert.
Rog pe cineva sa-mi curme suferinta Smile Spuneti-mi ca am scris o prostie pe care nu o vad de 2 zile.
Memorat
stocarul
Nu mai tace
*****

Karma: 49
Deconectat Deconectat

Mesaje: 203



Vezi Profilul
« Răspunde #8 : Martie 30, 2011, 20:55:58 »

Cod:
for(i=1;i<=M;i++)
{
scanf("%lld",&c);
if(c==0)
{
scanf("%lld %lld %lld",&S,&D,&x);
for(j=S;j<=D;j++)
A[j]=A[j]+x*(j-S+1);
}
else
{
scanf("%lld %lld",&S,&D);
R=0;
for(j=S;j<=D;j++)
R=R+A[j];
printf("%lld\n",R);
}
}
Mai simplu de atat nici ca se poate  Brick wall TOATE variabilele declarate long long. Am incercat si citire cu stream si sa trimit cu assert.
Rog pe cineva sa-mi curme suferinta Smile Spuneti-mi ca am scris o prostie pe care nu o vad de 2 zile.

La un update nu ți se dau cele două capete, ci capătul stâng și lungimea intervalului.
Memorat
andrei.12
Echipa infoarena
Nu mai tace
*****

Karma: 107
Deconectat Deconectat

Mesaje: 381



Vezi Profilul
« Răspunde #9 : Martie 30, 2011, 21:44:01 »

Citat
Cod:
for(i=1;i<=M;i++)
   {
      scanf("%lld",&c);
      if(c==0)
      {
         scanf("%lld %lld %lld",&S,&D,&x);
         for(j=S;j<=D;j++)
            A[j]=A[j]+x*(j-S+1);
      }
      else
      {
         scanf("%lld %lld",&S,&D);
         R=0;
         for(j=S;j<=D;j++)
            R=R+A[j];
         printf("%lld\n",R);
      }
   }
Mai simplu de atat nici ca se poate   TOATE variabilele declarate long long. Am incercat si citire cu stream si sa trimit cu assert.
Rog pe cineva sa-mi curme suferinta  Spuneti-mi ca am scris o prostie pe care nu o vad de 2 zile.

La un update nu ți se dau cele două capete, ci capătul stâng și lungimea intervalului.

Eu ti-am zis sa ai grija sa citesti datele corect Tongue
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #10 : Martie 30, 2011, 21:53:45 »

Pfai, ce neatent sunt.
Ideea e ca atunci cand ai un apel recursiv (query sau update) si ajungi intr-un nod asupra caruia s-a produs un update (cum ar fi in exemplul tau radacina subarborelui [1, 2]), sa actualizezi fii acestuia conform acestei valori inainte de a efectua apelurile recursive pentru fii. O problema la care este necesar acest truc este hotel. Ai putea sa incerci sa o rezolvi si pe aceasta ca exercitiu si, eventual, sa arunci o privire pe surse sa intelegi mai bine ideea.

De fiecare data cand ma gandesc la optimizarea update-ului pe interval imi vine in minte acea problema. Scuza-mi ignoranta, insa acolo query-ul nu era tot timpul pe [1,N]? In acea situatie inteleg de ce m-as opri cand intervalul curent il include pe cel pe care fac update pentru ca nu conteaza intervalele de "sub" el.
Exemplu: Ce se intampla daca vreau sa fac update pe [1,5] si apoi query pe [1,2]?
Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #11 : Martie 30, 2011, 23:04:00 »

Ba da, query-ul acolo este mereu pe [1, N], dar update-urile genereaza aceeasi problema.

Legat de exemplul tau (sa presupunem ca N = 8 ):
  • Actualizezi nodurile [1, 4] si [5, 5] conform operatiei de update.
  • La query intai intri pe [1, 5]. Mergi pe subarborele [1, 4]. Aici iti dai seama de faptul ca subarborele a fost actualizat si "impingi" informatia in jos (adica actualizezi [1, 2] si [3, 4] si stergi actualizarea din [1, 4]). Mergi mai departe pe ramura [1, 2], unde te opresti si poti calcula raspunsul corect.
Memorat

Am zis Mr. Green
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #12 : Martie 31, 2011, 13:43:41 »

In continuarea a ceea ce a zis Paul, nu e neaparat nevoie sa updatezi nodurile cand te duci in jos, de altfel mie mi se pare putin mai dubios asa. Eu de obicei cand am update pe interval, updatez tot asa intervalele pe care le includ, fara sa ma mai duc in jos, iar smecheria vine atunci cand fac query. In momentul in care ajung in nod, tin un parametru in recursivitate cu cat am updatat pana atunci pe drumu de la radacina pana la nodul curent.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #13 : Martie 31, 2011, 17:20:21 »

Multumesc pentru explicatii! Acum inteleg cum se face, insa vad ca tot nu e destul de eficient.

Deci, fac update pana la interval si ma opresc. Chestia care e putin cam dubioasa si de care nu sunt prea sigur e situatia cand fac de exemplu update de 2 ori pe acelasi interval (sau intervale apropiate). Daca fac prima data update pe [1,4] si "imping" informatia la [1,2] si [3,4], atunci a doua oara inainte sa fac asta trebuie sa fac update la fiii lui [1,2] si [3,4], nu? Pentru fiecare nod tin valoarea intervalului, numarul cu care trebuie facut update (acel k) si de unde incepe intervalul pe care s-a facut update cu acel k.

@devilkind: Nu prea inteleg cum functioneaza metoda ta, dar mersi oricum Smile
Memorat
avram_florin
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #14 : Aprilie 13, 2011, 13:27:06 »

Imi explica si mie cineva de ce e mai rapid unsigned long long decat long long.Stiu ca timpi pe care ii afiseaza evaluatorul sunt orientativi,dar era totusi o diferenta de 0.5 secunde,ceea ce mi se pare considerabil. Smile
Memorat
gorgovan
Strain
*

Karma: 8
Deconectat Deconectat

Mesaje: 37



Vezi Profilul
« Răspunde #15 : Aprilie 16, 2011, 18:36:10 »

As vrea si eu sa stiu cand este un nod al AINT-ului considerat "plin"?
Cand suma K-urilor cu care ca fost updatat este aceiasi in toate elementele din intervalul reprezentat de nodul respectiv?


PS: Ma refer strict la problema NumereX!
 Am mai folosit trucul cu vectorul full[] de mai multe ori pana acum.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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