SlideShare a Scribd company logo
1 of 24
1
Arbori de
intervale
Atestat la Informatica
Specializarea : Matematica - Informatica,
Intensiv Informatica
Profesor coordonator : Bogdan Marin
Patrick Catalin Alexandru Sava, clasa XII B
Colegiul National "Spiru Haret" Bucuresti
2
Cuprins
1. Programare Orientata pe Obiecte ( notiuniteoretice )
2. Arborii de intervale
a ) Introducere
b ) Necesitatea arborilorde intervale
c ) Update pe element
d ) Query pe element
e ) Query pe interval
f ) Update pe interval ( Update "Lazy", sau "Lazy propagation")
3. Arbori de intervalepersistenti
4. Codulin C ++
5. Cateva aplicatiialearborilorde intervale
a ) Aplicatiaclasicaa arborilorde intervale
b ) Aflarea subsirului crescator maximal al unui sir de N numere
c ) Aflarea celui de-al K-lea element in ordine sortata
d ) Problema "Qxy", propusa la PreOji 2016 ( concurs organizat
pe Infoarena )
6. Bibliografie
3
1. Programare Orientata pe Obiecte
In continuare, voi prezenta niste notiuni teoretice legate de Programarea Orientata pe Obiecte.
Nevrand sa ma abat foarte mult de la subiectul principal al atestatului, voi face o scurta trecere
in revista a unor notiuni de baza ce implica acest concept de programare.
Acum voi face o analogie cu un obiect din viata cotidiana : de exemplu, o masina. Acesta poate
fi considerat obiectul. Functiile lui le vom considera accelerarea, franarea, claxonarea,
aprinderea / stingerea farurilor, etc. Putem vizualiza aceste functii ca fiind scrise independent
intr-un limbaj de programare, fara a avea o legatura intre ele. Ce ar fi totusi daca acestea ar tine
de obiectul numit MASINA ?
Sa ne imaginamurmatoarele instructiuni :
MASINA.accelereaza ( )
MASINA.franeaza ( )
MASINA.claxoneaza ()
Aceasta legatura ( dintre functii si obiectul caruia ii corespund, se realizeaza prin Programarea
Orientata pe Obiecte. Ne vom creea o clasa, care va cuprinde mai multe functii, toate
apartinand aceluiasi obiect ( care are drept tip de data numele clasei de care apartin si functiile
). Un exemplu de cod se afla pe paginile urmatoare :
4
5
2. Arborii de intervale
a) Introducere
Inainte de a incepe saexplicefectivparticularitatiilesi avantajele acestei structuri de date,amsa va
prezintopoza care va va starni putincuriozitatea.
Primul lucrupe care il putemremarcain pozade mai sus este ca etichetele nodurilorsuntdistincte doua
cate douasi suntdisjuncte douacate doua pentrunoduri de pe acelasi nivel al arborelui.
Un alt lucrupe care il putemremarcaeste ca fiecare nod are exact doi fii,mai putinnodurile care
reprezintauninterval de lungime 1,reprezentandfrunzelearboreluide intervale ( unexemplude astfel
de nod este cel care este etichetatcu"4" ).Deducemimediatdupaaceastaobservatie caarborele este
binar.
In altaordine de idei,pentruunnodoarecare , observamca daca el este etichetatcuintervalul [ x ,y ],
atunci,fii lui vorfi etichetati cu[ x , m ], respectiv[ m+ 1 , y ] ( unde m = ( x + y ) / 2 ).Exceptie de la
acest patterngasitfac nodurile care suntfrunze.
Fie radacinaarborelui.Aceastaare inscriptionatape eaintervalul [1,n].Fii acesteiasuntetichetati cu
[1,(n+1)/2] si [(n+1)/2 + 1,n]. Observamcalungimeaintervalului cucare este etichetatun nodeste dubla
fata de lungimeaintervaluluicucare este etichetatoricare dintre cei doi fii ai acestuia.Vomconsideraca
radacina arborelui se aflape nivelul 1,fiii acesteiape nivelul 2,fiii fiilorpe nivelul 3,etc.O constatare pe
care o putemface cu usurintaeste ca nivelul maximdinacestarbore vatinde la
log2(lungimea_intervalului_cu_care_este_etichetat_nodul_radacina).Acestlucrueste echivalentcu
log2n.Concluzionamastfel caorice drumde la radacina laorice frunzaare un ordinde marime
logaritmic.
Acumsa ne imaginamca avemnevoie saaflammaximul pe unintervaldintr-unvectorcuN elemente.
Daca unnod care este etichetat[x,y] retinemaximul pe intervalul [x,y] s-arputeasafie mai rentabil sa
retinemaceste maximepe subintervale disjuncte ale vectorului.
6
In continuare voi prezentamodul incare ovomface.
Observamca un nodcare retine unmaximul pe uninterval de lungime 1reprezintauncaztrivial.
Maximul pe intervalul [i,i] este chiarv[i].Dacaamrezolvadescrescatorpe nivele( tinandcontca
radacina are nivelul minim,iarofrunzaare nivelulmaxim),amputeasacontinuamcombinand
rezultatelede pe unnivel curezultatelede pe nivelul anterior.Acestlucruse varealizautilizando
parcurgere recursiva,folosindconceptulde DivideetImpera.
Pentrusimplitate,vommentine acestarbore inmemoriacalculatorului cape unvector,unde daca unui
nodii corespunde indicele NODdinvector,fiilorsai ii vorcorespunde NOD*2 ( fiul stanga) si NOD* 2 +
1 ( fiul dreapta).De asemenea,oaltascriere a lui NOD* 2, utilizandlucrul pe biti este NOD<<1.
Evident,pe acelasi principiu,NOD*2 + 1 se scrie NOD << 1 | 1. Deci vom consideraca radacinaare
indicele 1,fiul stangaare indicele2,fiul dreaptaare indicele 3, fiul stangaal fiului stangaare indicele 4,
fiul dreaptaal fiului stangaare indicele5,fiul stangaal fiului dreaptaare indicele6,iar fiul dreaptaal
fiului dreaptaare indicele 7,etc.
b ) Necesitatea arborilor de intervale
De mentionateste caaceastastructura nu permite doaraflareaunui maximsauaunei sume pe interval,
ci permite si update-ulelementelor.Necesitateaacestei structuri de date este datade faptul ca
majoritateaoperatiilorcare cuo rezolvare brutas-ar realizaintimpliniar( adicaO ( N ) ), se pot realiza
folosindarbori de intervale intimplogaritmic( adicaO ( log2N ) ).
c ) Update pe element
Mai intai ne vom focusape update-ul elementelor( cumarborele de intervale este initial vid,vomavea
nevoie de update pentrua introduce randpe rand elementele dinvectorinarborele de intervale ).
7
Pentrusimplitate,vomignorafunctiaPush.(Aceastavafi explicatainpunctele urmatoare ale
atestatului).
Vectorul Tree varetine maximul pe intervalele dinarbore intimpce vectorul Sumvaretine sumape
intervale.
Atentie!
Nodurilepe care se retine maximul si suma suntdoar cele care se formeazadupa regulaprezentata in
capitoleleanterioare. De exemplu,daca radacinaretine intervalul [1,5], atunci fii acesteiavor retine
informatii pentruintervalele[1,3] si [4,5]. Deci nu va exista niciunnodcare sa retina informatii pentru
intervalul [2,4].
Revenindlacod,functianoastraare mai multi parametrii :
- nod,este de tipintregsi va retine indicele noduluicare retine intervalul[st,dr] inarborelede intervale
- st este de tipintregsi va retine capatul stangaal intervalului de pe nodul curent
- dr este de tipintregsi va retine capatul dreaptaal intervaluluide pe nodul curent
- poseste de tip intregsi va retine pozitiape care noi ne dorimsa efectuamunupdate
- val este de tipintregsi va retine valoareacare va fi pe pozitiaposcorespunzatoare siruluiinitial.
Daca st este egal cudr, inseamnaca am ajunsintr-ofrunza,ceeace reprezintauncaz trivial. Astfel,Tree
[ nod] si Sum[ nod] devinegale cuval.Inmomentul incare dam return,practic noi oprimavansarea
recursiva,deci functiavareluainordine inversatraseul pe care l-aparcurspana la nodul nod.Putem
vizualizaacestlucruca pe o stivain care lafiecare apelare afunctiei recursiveinseramvariabilanod.In
momentul incare oprimrecursivitatea,ordineanodurilorpe care le vomparcurge va fi data de ordinea
valorilordinstiva,de lavarf spre baza.
Dupa cum am mai spus,intervalul [st,dr] se descompune indouaintervale disjuncte,acaror reuniune
este chiar[st,dr].Daca pozitiape care vremsa efectuamupdate-ul este mai micasauegaladecatmij,
este evidentcavommerge pe fiul stang,iarin caz contrar vommerge pe fiul drept.
Dupa ne vom intoarce dinrecursivitate,aceastaordine aefectuariioperatiilorfiindu-ne favorabila,
deoarece inmomentul incare ne aflamlaun nod,vom aveagarantiaca toate informatiile din
subarborele sausuntcorectcalculate.Deci candsuntemla nodul curent,mai ramane doar sa actualizam
maximul si sumacu ajutorul informatiilorpe care le detincei doi fii ai nodului.
Complexitatea unuisingur update este O ( log2N ).
8
d ) Query pe element
Query-ul pe elementpoate fi consideratdestul de trivial in momentul incare ati intelesbine update-ul.
Practic functiaeste identicainmare parte cu cea de update,numai caniciovaloare nuse mai schimba.
Complexitatea unuisingur query pe element este O ( log2N ).
e ) Query pe interval
Am vreasa aflamfie maximul,fiesumape uninterval [a,b] dat.Programul de pe paginaurmatoare
rezolvaacesttaskin complexitate O(log2N). Lafiecare pas,daca gasimun nodcare este etichetatcuun
interval ce este inclusinintervalul [a,b],returnaminformatiadinnodul respectiv,nefiindnevoiesamai
ne expandamrecursivinsubarborelenodului .Daca mijlocul intervalului curenteste mai mare decata,
inseamnacatrebuie sane expandaminfiul stang,pentrucaaveminformatii de aflatpentruintervalul
[a,mijloc].De asemenea,dacamijlocul intervalului curenteste mai micdecatcapatul dreaptaal
intervalului [a,b],avemnevoie samergemrecursivpe fiul dreptpentruaobtine informatii despre
intervalul [mijloc+1 , b]. De mentionatarfi ca nueste neaaparatanevoie saactualizamsumasi
maximul (functiafiindscrisaincadrul unei clase,rezolvasi problemaupdate-ului pe intervalinacelasi
timp-lucrupe care il veti aflaincapitolele urmatoare).Cumlafiecare pas,din4 noduri posibile,se
acceseazamaxim2, complexitateadevineO( log2N).
9
Codul de mai sus rezolvaproblemamaximului pe interval,intimpce codul de mai joso rezolvape cea a
sumei pe interval.
Complexitatea unuisingur query pe interval este O ( log2N ).
Nota: Acest lucru ne garanteaza ca la un query de acest tip, se acceseazaun numar logaritmicde
noduri dinarbore.
10
f ) Update pe interval ( Update "Lazy", sau "Lazy
propagation" )
A venitsi momentul sadestainuiutilitateafunctiei pushdincadrul codurilorde mai sus.Amdiscutatla
subpunctul c) ca complexitateaunui update de elementse realizeazaintimplogaritmic.Darce ar fi sa
avemun update incare toate numerele dintr-uninterval [a,b]suntcrescute cuo anumitavaloare ?
Complexitateaardeveni astfel incel mai raucaz O ( N * log2N ),ceeace ar strica putinutilitateaacestei
structuri de date.Ei bine,daca atunci cand avemun interval [a,b],luamtoate cele log2N noduri incare
se descompune acestinterval innoduri dinarborele de intervale,avemcomplexitateaO( log2N ).Ce
facemtotusi cu update-ul ?Momentann-amrealizatpracticnimic.Raspunsul este destul de imprevizibil
: ne putemtine unvectorLazy [],cu semnificatiacaLazy [ nod] retine cuce valoare trebuie sacreasca
numerele dinintervalul cucare nodul nodeste etichetat.Remarcasemincapitolele anterioare ca
reuniuneacelordouaintervale cucare suntetichetati fii nodului nodproducchiarintervalul cucare este
etichetatnodul nod.Acumacestlucrune ajuta foarte mult: pur si simplu,lafiecare pas cand trecem
printr-unnodcare are Lazy [ nod ] nenul,avemgrijasa crestemvaloareaTree [ nod] cu Lazy [ nod], sa
crestemSum[ nod] cu Lazy [ nod ] * ( dr - st + 1 ) ( unde [ st , dr ] este intervalul cucare este etichetat
nodul nod) si sa propagam aceastavaloare fiilor.Cualte cuvinte,Lazy[ nod<< 1 ] += Lazy [ nod ] si Lazy
[ nod<< 1 | 1 ] += Lazy [ nod ].La final avemgrijasafacemLazy [ nod ] = 0, ceeace semnificafaptul ca
am updatatnodul nod. Practic, updatamdoar cand avemnevoie.
Complexitatea functiei Push( ) este O ( 1 ).
11
3. Arbori de intervale persistenti
Pentrua intelegemai bine notiuneade persistentaincadrul structurilorde date,voi face oparalelaintre
persistentasi celebrul "History"al browserelorde cautare dinziuade azi.Sa zicemca intrupe 5 siteuri,
numite A,B,C, D si E. Acum vreausa intrupe site-ul care este "launundo"distantade site-ul curent.
Acelaeste site-ulD.Acumvreausa intrupe site-ul care este "ladouaundo-uri"distantade site-ul
curent.Acelaeste site-ulB.Putemvizualizatotul cape o stivain care facempopla fiecare undosi push
la fiecare update.
Revenindlaarborii de intervale,saconsideramurmatoareaproblema:
"Se da un sir de N elemente.Si unsetde Moperatii.Ooperatie poate fi de tip1, 2, 3, sau 4.
Operatiade tip1 cere schimbareavalorii de pe pozitiaposcuo valoare x data.
Operatiade tip2 cere interogareaminimuluipe intervalul[a,b].
Operatiade tip3 adauga pe fiecare elementdinintervalul [a,b] ovaloare x data.
Operatiade tip4 cere sa se revinalao versiune anterioaraasirului,ignorandu-se ultimele Koperatii de
tip1 si 3. Ni se garanteaza de asemeneacaK <= numarul operatiilorde tip1 si 3 anterioare.
Restrictii:N ,M <= 2 * 105
Limitade timp: o secundapertest
"
Am putearezolvaproblemacreeand unarbore de intervale pentrufiecare operatie de tip1sau 3, iar in
momentul incare primimooperatie de tip4 sa accesamarborele de intervalesituatdinpunctde vedere
cronologiccu K pozitii inainteacelui curent.Aceastasolutie are complexitateaO( N2
* log2N ) si nu se
incadreazaintimp.Intr-unconcurs,daca am fi primitaceastaproblemasi am fi rezolvat-ocuaceasta
solutie,cuputinnorocam fi obtinut30 de puncte din100.
Am aflatincapitolele anterioare calao operatie de tipul 1sau 3, trecemprintr-unnumarlogaritmicde
noduri intimpul update-ului.Acestlucrune duce cugandul ca putemfi "greedy",astfelcaputem
refolosi nodurilecare nufac parte dinnodurile cucare avemtreaba intimpul update-ului.Ne vine ideea
sa ne retinemarborele de intervale cuolistainlantuita,nemaifolosindconventiacafiul stangeste
indexul noduluicurentmultiplicatcu2 si fiul drepteste indexul noduluicurentmultiplicatcu2 si adunat
cu 1. Astfel unnodnod,are fiul stanganod.lefttsi nodul dreaptanod.rightt.
Strategiape care o vomaborda va fi ca de fiecare datacand avemun update,sane copiemnodul curent
intr-altul proaspatcreat,iarla fiecare passa returnamrespectivul nod( acestava fi fiul stangasau
dreaptaal unui nodsituatpe nivelul imediatsuperior).Putemremarcacamereu,lafiecare update,
radacina vafi copiata,iarradacina curentava unic-determinaceamai nouaversiune aarborelui.
12
Ne vine ideeacainmomentul incare trebuie saefectuamooperatie de tip4, tot ce avemde facut este
sa folosimradacinade latimpul potrivit.Dacaradacinaarborelui curenteste Root[ n ], atunci radacina
de care avemnevoie este Root[ n - k ].Observamca memorianupreaare de suferit,avandnevoie de
NlogN memorie.
Mai sus este definitiafunctieide duplicare aunui nod,iar mai josdefinitiafunctieide update pe
element.Aceastarezolvaoperatiade tip1. Operatiile de tip2si 3 se realizeazasimilarcucele de la
versiuneanepersistentaexplicatainpunctul 2.In caz de neclaritati,veti gasi intregcodul inpunctul 4.
Legat de complexitate,operatiile de tip1, 2 si 3 se rezolvain O ( log2N), iar operatia de tip 4 inO ( 1 ).
13
4. Codul in C ++
14
15
16
17
18
19
20
21
5. Cateva aplicatii ale arborilor de
intervale
a ) Aplicatia clasica a arborilor de intervale
"Fie un vector A cu N elementenaturale.Asupralui se vorface M operatii,codificateastfel in
fisierul deintrare:
• 0 a b - Sase determinemaximul dinintervalul [a,b] (maximul dintrevalorile Ai cua ≤ i ≤ b).
• 1 a b - Valoareaelementuluidepepozita a va deveni b.
Restrictii:N , M <= 2 * 105
Limita de timp: o secunda pertest
"
Aceasta problema este o aplicatie triviala a arborilor de intervale. Ne vomfolosi doar de clasa
"SegmentTree", iar pentru operatia de tip 0, folosimfunctia "RangeQuery", in timp ce pentru
operatia de tip 1 folosim functia "ElementUpdate". ComplexitateafinalaesteO( Nlog2N ), ceea ce
se incadreaza lejer in limita de timp si obtine 100 de puncte. ( A se studia codul de la punctul 4 ).
b ) Aflarea subsirului crescator maximal al unui sir de N
numere
Cu totii stim problema clasica de programare dinamica care ne cere sa aflam cel mai lung subsir
crescator al unui sir de N numere. (Restrictii:N <= 2 * 105
; Limitade timp: o secundapertest )
1. Definirea starii : Dp [ i ] = lungimea subsirului crescator maximal care se termina in valoarea i
2. Recurenta : Dp [ i ] = max ( Dp [ i ] , Dp [ k ] + 1 ), cu k de la 1 la i - 1
3.Raspunsul : Max ( Dp [ i ] ), cu i de la 1 la valmax din sir
*** Daca Valmax are un ordin de marime exagerat, putem normaliza ( sortam, iar fiecaruinumar ii
atribuim in loc de valoarea sa, indicele pozitiei pe care se afla in ordinea sortata; astfel ordinea
22
relativa dintre numerele din sir se pastreaza, iar ordinul de marime al numerelor din sir se
micsoreaza semnificativ ( adica devine maxim n ) ) numerele din sir.
Complexitatea acestui algoritm implementat intr-un mod brut este O ( N2 ). Totusi, daca studiem
atent recurenta, vom remarca faptul ca un arbore de intervale ne-ar usura foarte mult munca. Cu
alte cuvinte,putem reduce problema la cea anterioara, la fiecare pas al recurentei facandexact un
query si eventual un update. Recurenta se transforma in Dp [ i ] = max ( Arbore.Acces ( 1 , 1 , n , i
)/*ceea ce inseamna accesarea elementului de pe pozitia i*/ ,
Arbore.RangeQuery ( 1 , 1 , n , 1 , i - 1 ) /* ceea ce inseamna maximul pe intervalul [1,i-1] */ + 1 ),
complexitateafinala aalgoritmului devenindO( Nlog2N).
c ) Aflarea celui de-al K-lea element in ordine sortata dintr-
un sir de N numere
"Se da un sir de N numere naturale. Sa se afiseze al K-lea element in ordine sortata fara a sorta sirul.
( problema originala este mai complexa, avand si update-uri, ceea cenu ne permite sa preprocesam
sortarea sirului )." (Restrictii:N <= 2 * 105
; Limitade timp: o secundaper test)
Vomfolosi unarbore de intervale pe postde vectorde frecventa.Cualte cuvinte,functianoastrade
update,nuva fi conceputasa schimbe valoareaunui elementdinsir,ci sa incrementeze valoareaunui
elementdinstructuranoastrade date.Pe acestarbore de intervale ne vomtine suma.
Este evidentcanumarul de numere care sunt inintervalul [1,x ] <= numarul de numere care sunt in
intervalul [1,x+1]. Acestlucrune arata ca sirul sumelorpartiale pe vectorul de frecventaal sirului este
crescator,fapt ce ne duce cu gandul la a cauta binar valoareamaximapentrucare sumape intervalul
[1,valoare ] este <= cu k.Cautarea binaraare complexitate logaritmica,intimpce query-ul de aflare a
sumei pe uninterval inarborele de intervale are aceeasi complexitate.Prinurmare,complexitatea
acestei solutii esteO( log2
2N ).
Existatotusi si o rezolvare mai eficienta,intimplogaritmic,care rezultadineliminareacautarii binare a
valorii.Ce ar fi sa ...cautam binarchiar pe arborele de intervale ?Candsuntemintr-unnodX,noi stim
care este sumaintervalului cucare este etichetatfiul saustang/drept.Prinurmare,pentruunKdat,
pornimdinradacina,iar lafiecare pasne intrebamdacasuma fiului stangeste mai mare decatK.Daca
este mai mare,inseamnaca valoareacautatase aflainsubarborele fiului stang.Incazcontrar, cautam a
K - sum[ fiustang] valoare insubarborele fiuluidrept. Reluamprocedeul panacandK ajunge nul.
Complexitate finala: O ( log2N ).
23
d ) Problema "Qxy", propusa la PreOji 2016 ( concurs
organizat pe Infoarena )
" Fie un şira 1 , a 2 , ..., a n de numerenaturale. Trebuiesărăspundeţi laQ întrebări deforma:
date douăpoziţii i şi j şi douănumerenaturalex şi y, câte elemente dinsecvenţaa i , a i+1 , ...,
a j au valoareacuprinsăîntrexşi y ?
[....]
 2 ≤ n ≤ 10000
 1 ≤ i ≤ j ≤ n
 0 ≤ a[i] ≤1 000
 0 ≤ x ≤ y ≤ 1000
 1 ≤ Q ≤ 100 000
"
Aceasta problema este o aplicatie triviala a arborilor de intervale persistenti. Foarte pe scurt, ne
vom creea o noua copie a arborelui la fiecarepozitie i, cu i intre 1 si n. Cand avem un query, este clar
ca ne intereseaza doar informatii salvate intre copiile de pe pozitiile i si j. Daca ar fi fostsa ni se
ceara numarul valorilor cuprinse intre x si y pe intervalul [ 1, j ], raspunsul ar fi fost suma pe
intervalul [x,y] pornind din radacina creata la pozitia j. Aceasta suma cuprinde totusi si suma pentru
query-ul pe intervalul [ i, j]. Ne vine ideea sa scadem din suma pe intervalul [ x , y ] la "momentul" j,
suma pe intervalul [ x , y ] la "momentul" i -1, folosind practic principiul de la sume partiale. Intr-un
mod surprinzator, problema este rezolvata.
ComplexitatefinalaO( ( Q + n ) log2Valmax), undeValmaxemax ( a [ i ] ), cu i de la1 la n
24
6. Bibliografie
In procesul de creare al acestui atestat, m-am folositde titlurile si continuturile unor probleme de
pe www.infoarena.ro,www.codeforces.comsiwww. e-maxx.ru

More Related Content

What's hot

Biserici de lemn monumente istorice din judetul Bihor
Biserici de lemn monumente istorice din judetul BihorBiserici de lemn monumente istorice din judetul Bihor
Biserici de lemn monumente istorice din judetul BihorBiblioteci Bihorene
 
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhov
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhovViata bunul-cel-mai-de-pret-omraam-mikhael-aivanhov
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhovSorina Iacob
 
Desfasurarea procesului de terapie ocupationala
Desfasurarea procesului de terapie ocupationalaDesfasurarea procesului de terapie ocupationala
Desfasurarea procesului de terapie ocupationalaLidia Iacov
 
Chestionar roger harrison
Chestionar roger harrisonChestionar roger harrison
Chestionar roger harrisoneconsiliere
 
Legumicultura
LegumiculturaLegumicultura
LegumiculturaGaby CH
 
lectie biologie clasa a 9 a
lectie biologie clasa a 9 alectie biologie clasa a 9 a
lectie biologie clasa a 9 aibcioba
 
Comunicarea cu parintii
Comunicarea cu parintiiComunicarea cu parintii
Comunicarea cu parintiiIna Dumbrava
 
Omraam mikhael-aivanhov-lumina-spirit-viu
Omraam mikhael-aivanhov-lumina-spirit-viuOmraam mikhael-aivanhov-lumina-spirit-viu
Omraam mikhael-aivanhov-lumina-spirit-viuSorina Iacob
 
Melania caraconcea lucrare de disertatie
Melania caraconcea lucrare de disertatieMelania caraconcea lucrare de disertatie
Melania caraconcea lucrare de disertatieGeta Soca
 
Metode didactice folosite in predarea stem
Metode didactice folosite in predarea stemMetode didactice folosite in predarea stem
Metode didactice folosite in predarea stemNectara Mircioaga
 
Infiintarea si intretinerea culturilor de legume
Infiintarea si intretinerea culturilor de legumeInfiintarea si intretinerea culturilor de legume
Infiintarea si intretinerea culturilor de legumeBolocan Valentin
 
Omraam mikhael-aivanhov-yoga-nutritiei
Omraam mikhael-aivanhov-yoga-nutritieiOmraam mikhael-aivanhov-yoga-nutritiei
Omraam mikhael-aivanhov-yoga-nutritieiSorina Iacob
 
Tulburarile Nevrotice, Tulburarile Legate De Stres Si
Tulburarile Nevrotice, Tulburarile Legate De Stres SiTulburarile Nevrotice, Tulburarile Legate De Stres Si
Tulburarile Nevrotice, Tulburarile Legate De Stres Si1Leu
 

What's hot (20)

Biserici de lemn monumente istorice din judetul Bihor
Biserici de lemn monumente istorice din judetul BihorBiserici de lemn monumente istorice din judetul Bihor
Biserici de lemn monumente istorice din judetul Bihor
 
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhov
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhovViata bunul-cel-mai-de-pret-omraam-mikhael-aivanhov
Viata bunul-cel-mai-de-pret-omraam-mikhael-aivanhov
 
0 densitatea
0 densitatea0 densitatea
0 densitatea
 
Desfasurarea procesului de terapie ocupationala
Desfasurarea procesului de terapie ocupationalaDesfasurarea procesului de terapie ocupationala
Desfasurarea procesului de terapie ocupationala
 
Chestionar roger harrison
Chestionar roger harrisonChestionar roger harrison
Chestionar roger harrison
 
Legumicultura
LegumiculturaLegumicultura
Legumicultura
 
Introducere in informatica
Introducere in informaticaIntroducere in informatica
Introducere in informatica
 
Ghid de-nursing
Ghid de-nursingGhid de-nursing
Ghid de-nursing
 
Importanta grasimilor
Importanta grasimilorImportanta grasimilor
Importanta grasimilor
 
lectie biologie clasa a 9 a
lectie biologie clasa a 9 alectie biologie clasa a 9 a
lectie biologie clasa a 9 a
 
Comunicarea cu parintii
Comunicarea cu parintiiComunicarea cu parintii
Comunicarea cu parintii
 
15425776 Teofilact Ligurda
15425776 Teofilact Ligurda15425776 Teofilact Ligurda
15425776 Teofilact Ligurda
 
Omraam mikhael-aivanhov-lumina-spirit-viu
Omraam mikhael-aivanhov-lumina-spirit-viuOmraam mikhael-aivanhov-lumina-spirit-viu
Omraam mikhael-aivanhov-lumina-spirit-viu
 
Melania caraconcea lucrare de disertatie
Melania caraconcea lucrare de disertatieMelania caraconcea lucrare de disertatie
Melania caraconcea lucrare de disertatie
 
Metode didactice folosite in predarea stem
Metode didactice folosite in predarea stemMetode didactice folosite in predarea stem
Metode didactice folosite in predarea stem
 
Infiintarea si intretinerea culturilor de legume
Infiintarea si intretinerea culturilor de legumeInfiintarea si intretinerea culturilor de legume
Infiintarea si intretinerea culturilor de legume
 
Rebus
RebusRebus
Rebus
 
Cele 7 legi spirituale ale succesului - DEEPAK CHOPRA
Cele 7 legi spirituale ale succesului - DEEPAK CHOPRACele 7 legi spirituale ale succesului - DEEPAK CHOPRA
Cele 7 legi spirituale ale succesului - DEEPAK CHOPRA
 
Omraam mikhael-aivanhov-yoga-nutritiei
Omraam mikhael-aivanhov-yoga-nutritieiOmraam mikhael-aivanhov-yoga-nutritiei
Omraam mikhael-aivanhov-yoga-nutritiei
 
Tulburarile Nevrotice, Tulburarile Legate De Stres Si
Tulburarile Nevrotice, Tulburarile Legate De Stres SiTulburarile Nevrotice, Tulburarile Legate De Stres Si
Tulburarile Nevrotice, Tulburarile Legate De Stres Si
 

Similar to Arbori de-intervale

Gc baleiere _infasuratoare_convexa (2)
Gc baleiere _infasuratoare_convexa (2)Gc baleiere _infasuratoare_convexa (2)
Gc baleiere _infasuratoare_convexa (2)CatalinLaslau
 
E d informatica_2020_sp_sn_c_var_test_04
E d informatica_2020_sp_sn_c_var_test_04E d informatica_2020_sp_sn_c_var_test_04
E d informatica_2020_sp_sn_c_var_test_04Ovidiu Dumitrescu
 
00007 backtracking
00007 backtracking00007 backtracking
00007 backtrackingAlly Le
 
Metoda backtracking(1)
Metoda backtracking(1)Metoda backtracking(1)
Metoda backtracking(1)Balan Veronica
 
problema_informatica_subsecvente_24.pptx
problema_informatica_subsecvente_24.pptxproblema_informatica_subsecvente_24.pptx
problema_informatica_subsecvente_24.pptxTeodoraSumurduc
 
X matematica (in limba romana)
X matematica (in limba romana)X matematica (in limba romana)
X matematica (in limba romana)Andrei Ghidion
 
Curs 3 Data Mining
Curs 3 Data MiningCurs 3 Data Mining
Curs 3 Data MiningLucian Sasu
 
Structuri De Date Alocate Dinamic
Structuri De Date Alocate DinamicStructuri De Date Alocate Dinamic
Structuri De Date Alocate DinamicCarmen Negrea
 

Similar to Arbori de-intervale (9)

Gc baleiere _infasuratoare_convexa (2)
Gc baleiere _infasuratoare_convexa (2)Gc baleiere _infasuratoare_convexa (2)
Gc baleiere _infasuratoare_convexa (2)
 
Metoda reluării
Metoda reluăriiMetoda reluării
Metoda reluării
 
E d informatica_2020_sp_sn_c_var_test_04
E d informatica_2020_sp_sn_c_var_test_04E d informatica_2020_sp_sn_c_var_test_04
E d informatica_2020_sp_sn_c_var_test_04
 
00007 backtracking
00007 backtracking00007 backtracking
00007 backtracking
 
Metoda backtracking(1)
Metoda backtracking(1)Metoda backtracking(1)
Metoda backtracking(1)
 
problema_informatica_subsecvente_24.pptx
problema_informatica_subsecvente_24.pptxproblema_informatica_subsecvente_24.pptx
problema_informatica_subsecvente_24.pptx
 
X matematica (in limba romana)
X matematica (in limba romana)X matematica (in limba romana)
X matematica (in limba romana)
 
Curs 3 Data Mining
Curs 3 Data MiningCurs 3 Data Mining
Curs 3 Data Mining
 
Structuri De Date Alocate Dinamic
Structuri De Date Alocate DinamicStructuri De Date Alocate Dinamic
Structuri De Date Alocate Dinamic
 

Arbori de-intervale

  • 1. 1 Arbori de intervale Atestat la Informatica Specializarea : Matematica - Informatica, Intensiv Informatica Profesor coordonator : Bogdan Marin Patrick Catalin Alexandru Sava, clasa XII B Colegiul National "Spiru Haret" Bucuresti
  • 2. 2 Cuprins 1. Programare Orientata pe Obiecte ( notiuniteoretice ) 2. Arborii de intervale a ) Introducere b ) Necesitatea arborilorde intervale c ) Update pe element d ) Query pe element e ) Query pe interval f ) Update pe interval ( Update "Lazy", sau "Lazy propagation") 3. Arbori de intervalepersistenti 4. Codulin C ++ 5. Cateva aplicatiialearborilorde intervale a ) Aplicatiaclasicaa arborilorde intervale b ) Aflarea subsirului crescator maximal al unui sir de N numere c ) Aflarea celui de-al K-lea element in ordine sortata d ) Problema "Qxy", propusa la PreOji 2016 ( concurs organizat pe Infoarena ) 6. Bibliografie
  • 3. 3 1. Programare Orientata pe Obiecte In continuare, voi prezenta niste notiuni teoretice legate de Programarea Orientata pe Obiecte. Nevrand sa ma abat foarte mult de la subiectul principal al atestatului, voi face o scurta trecere in revista a unor notiuni de baza ce implica acest concept de programare. Acum voi face o analogie cu un obiect din viata cotidiana : de exemplu, o masina. Acesta poate fi considerat obiectul. Functiile lui le vom considera accelerarea, franarea, claxonarea, aprinderea / stingerea farurilor, etc. Putem vizualiza aceste functii ca fiind scrise independent intr-un limbaj de programare, fara a avea o legatura intre ele. Ce ar fi totusi daca acestea ar tine de obiectul numit MASINA ? Sa ne imaginamurmatoarele instructiuni : MASINA.accelereaza ( ) MASINA.franeaza ( ) MASINA.claxoneaza () Aceasta legatura ( dintre functii si obiectul caruia ii corespund, se realizeaza prin Programarea Orientata pe Obiecte. Ne vom creea o clasa, care va cuprinde mai multe functii, toate apartinand aceluiasi obiect ( care are drept tip de data numele clasei de care apartin si functiile ). Un exemplu de cod se afla pe paginile urmatoare :
  • 4. 4
  • 5. 5 2. Arborii de intervale a) Introducere Inainte de a incepe saexplicefectivparticularitatiilesi avantajele acestei structuri de date,amsa va prezintopoza care va va starni putincuriozitatea. Primul lucrupe care il putemremarcain pozade mai sus este ca etichetele nodurilorsuntdistincte doua cate douasi suntdisjuncte douacate doua pentrunoduri de pe acelasi nivel al arborelui. Un alt lucrupe care il putemremarcaeste ca fiecare nod are exact doi fii,mai putinnodurile care reprezintauninterval de lungime 1,reprezentandfrunzelearboreluide intervale ( unexemplude astfel de nod este cel care este etichetatcu"4" ).Deducemimediatdupaaceastaobservatie caarborele este binar. In altaordine de idei,pentruunnodoarecare , observamca daca el este etichetatcuintervalul [ x ,y ], atunci,fii lui vorfi etichetati cu[ x , m ], respectiv[ m+ 1 , y ] ( unde m = ( x + y ) / 2 ).Exceptie de la acest patterngasitfac nodurile care suntfrunze. Fie radacinaarborelui.Aceastaare inscriptionatape eaintervalul [1,n].Fii acesteiasuntetichetati cu [1,(n+1)/2] si [(n+1)/2 + 1,n]. Observamcalungimeaintervalului cucare este etichetatun nodeste dubla fata de lungimeaintervaluluicucare este etichetatoricare dintre cei doi fii ai acestuia.Vomconsideraca radacina arborelui se aflape nivelul 1,fiii acesteiape nivelul 2,fiii fiilorpe nivelul 3,etc.O constatare pe care o putemface cu usurintaeste ca nivelul maximdinacestarbore vatinde la log2(lungimea_intervalului_cu_care_este_etichetat_nodul_radacina).Acestlucrueste echivalentcu log2n.Concluzionamastfel caorice drumde la radacina laorice frunzaare un ordinde marime logaritmic. Acumsa ne imaginamca avemnevoie saaflammaximul pe unintervaldintr-unvectorcuN elemente. Daca unnod care este etichetat[x,y] retinemaximul pe intervalul [x,y] s-arputeasafie mai rentabil sa retinemaceste maximepe subintervale disjuncte ale vectorului.
  • 6. 6 In continuare voi prezentamodul incare ovomface. Observamca un nodcare retine unmaximul pe uninterval de lungime 1reprezintauncaztrivial. Maximul pe intervalul [i,i] este chiarv[i].Dacaamrezolvadescrescatorpe nivele( tinandcontca radacina are nivelul minim,iarofrunzaare nivelulmaxim),amputeasacontinuamcombinand rezultatelede pe unnivel curezultatelede pe nivelul anterior.Acestlucruse varealizautilizando parcurgere recursiva,folosindconceptulde DivideetImpera. Pentrusimplitate,vommentine acestarbore inmemoriacalculatorului cape unvector,unde daca unui nodii corespunde indicele NODdinvector,fiilorsai ii vorcorespunde NOD*2 ( fiul stanga) si NOD* 2 + 1 ( fiul dreapta).De asemenea,oaltascriere a lui NOD* 2, utilizandlucrul pe biti este NOD<<1. Evident,pe acelasi principiu,NOD*2 + 1 se scrie NOD << 1 | 1. Deci vom consideraca radacinaare indicele 1,fiul stangaare indicele2,fiul dreaptaare indicele 3, fiul stangaal fiului stangaare indicele 4, fiul dreaptaal fiului stangaare indicele5,fiul stangaal fiului dreaptaare indicele6,iar fiul dreaptaal fiului dreaptaare indicele 7,etc. b ) Necesitatea arborilor de intervale De mentionateste caaceastastructura nu permite doaraflareaunui maximsauaunei sume pe interval, ci permite si update-ulelementelor.Necesitateaacestei structuri de date este datade faptul ca majoritateaoperatiilorcare cuo rezolvare brutas-ar realizaintimpliniar( adicaO ( N ) ), se pot realiza folosindarbori de intervale intimplogaritmic( adicaO ( log2N ) ). c ) Update pe element Mai intai ne vom focusape update-ul elementelor( cumarborele de intervale este initial vid,vomavea nevoie de update pentrua introduce randpe rand elementele dinvectorinarborele de intervale ).
  • 7. 7 Pentrusimplitate,vomignorafunctiaPush.(Aceastavafi explicatainpunctele urmatoare ale atestatului). Vectorul Tree varetine maximul pe intervalele dinarbore intimpce vectorul Sumvaretine sumape intervale. Atentie! Nodurilepe care se retine maximul si suma suntdoar cele care se formeazadupa regulaprezentata in capitoleleanterioare. De exemplu,daca radacinaretine intervalul [1,5], atunci fii acesteiavor retine informatii pentruintervalele[1,3] si [4,5]. Deci nu va exista niciunnodcare sa retina informatii pentru intervalul [2,4]. Revenindlacod,functianoastraare mai multi parametrii : - nod,este de tipintregsi va retine indicele noduluicare retine intervalul[st,dr] inarborelede intervale - st este de tipintregsi va retine capatul stangaal intervalului de pe nodul curent - dr este de tipintregsi va retine capatul dreaptaal intervaluluide pe nodul curent - poseste de tip intregsi va retine pozitiape care noi ne dorimsa efectuamunupdate - val este de tipintregsi va retine valoareacare va fi pe pozitiaposcorespunzatoare siruluiinitial. Daca st este egal cudr, inseamnaca am ajunsintr-ofrunza,ceeace reprezintauncaz trivial. Astfel,Tree [ nod] si Sum[ nod] devinegale cuval.Inmomentul incare dam return,practic noi oprimavansarea recursiva,deci functiavareluainordine inversatraseul pe care l-aparcurspana la nodul nod.Putem vizualizaacestlucruca pe o stivain care lafiecare apelare afunctiei recursiveinseramvariabilanod.In momentul incare oprimrecursivitatea,ordineanodurilorpe care le vomparcurge va fi data de ordinea valorilordinstiva,de lavarf spre baza. Dupa cum am mai spus,intervalul [st,dr] se descompune indouaintervale disjuncte,acaror reuniune este chiar[st,dr].Daca pozitiape care vremsa efectuamupdate-ul este mai micasauegaladecatmij, este evidentcavommerge pe fiul stang,iarin caz contrar vommerge pe fiul drept. Dupa ne vom intoarce dinrecursivitate,aceastaordine aefectuariioperatiilorfiindu-ne favorabila, deoarece inmomentul incare ne aflamlaun nod,vom aveagarantiaca toate informatiile din subarborele sausuntcorectcalculate.Deci candsuntemla nodul curent,mai ramane doar sa actualizam maximul si sumacu ajutorul informatiilorpe care le detincei doi fii ai nodului. Complexitatea unuisingur update este O ( log2N ).
  • 8. 8 d ) Query pe element Query-ul pe elementpoate fi consideratdestul de trivial in momentul incare ati intelesbine update-ul. Practic functiaeste identicainmare parte cu cea de update,numai caniciovaloare nuse mai schimba. Complexitatea unuisingur query pe element este O ( log2N ). e ) Query pe interval Am vreasa aflamfie maximul,fiesumape uninterval [a,b] dat.Programul de pe paginaurmatoare rezolvaacesttaskin complexitate O(log2N). Lafiecare pas,daca gasimun nodcare este etichetatcuun interval ce este inclusinintervalul [a,b],returnaminformatiadinnodul respectiv,nefiindnevoiesamai ne expandamrecursivinsubarborelenodului .Daca mijlocul intervalului curenteste mai mare decata, inseamnacatrebuie sane expandaminfiul stang,pentrucaaveminformatii de aflatpentruintervalul [a,mijloc].De asemenea,dacamijlocul intervalului curenteste mai micdecatcapatul dreaptaal intervalului [a,b],avemnevoie samergemrecursivpe fiul dreptpentruaobtine informatii despre intervalul [mijloc+1 , b]. De mentionatarfi ca nueste neaaparatanevoie saactualizamsumasi maximul (functiafiindscrisaincadrul unei clase,rezolvasi problemaupdate-ului pe intervalinacelasi timp-lucrupe care il veti aflaincapitolele urmatoare).Cumlafiecare pas,din4 noduri posibile,se acceseazamaxim2, complexitateadevineO( log2N).
  • 9. 9 Codul de mai sus rezolvaproblemamaximului pe interval,intimpce codul de mai joso rezolvape cea a sumei pe interval. Complexitatea unuisingur query pe interval este O ( log2N ). Nota: Acest lucru ne garanteaza ca la un query de acest tip, se acceseazaun numar logaritmicde noduri dinarbore.
  • 10. 10 f ) Update pe interval ( Update "Lazy", sau "Lazy propagation" ) A venitsi momentul sadestainuiutilitateafunctiei pushdincadrul codurilorde mai sus.Amdiscutatla subpunctul c) ca complexitateaunui update de elementse realizeazaintimplogaritmic.Darce ar fi sa avemun update incare toate numerele dintr-uninterval [a,b]suntcrescute cuo anumitavaloare ? Complexitateaardeveni astfel incel mai raucaz O ( N * log2N ),ceeace ar strica putinutilitateaacestei structuri de date.Ei bine,daca atunci cand avemun interval [a,b],luamtoate cele log2N noduri incare se descompune acestinterval innoduri dinarborele de intervale,avemcomplexitateaO( log2N ).Ce facemtotusi cu update-ul ?Momentann-amrealizatpracticnimic.Raspunsul este destul de imprevizibil : ne putemtine unvectorLazy [],cu semnificatiacaLazy [ nod] retine cuce valoare trebuie sacreasca numerele dinintervalul cucare nodul nodeste etichetat.Remarcasemincapitolele anterioare ca reuniuneacelordouaintervale cucare suntetichetati fii nodului nodproducchiarintervalul cucare este etichetatnodul nod.Acumacestlucrune ajuta foarte mult: pur si simplu,lafiecare pas cand trecem printr-unnodcare are Lazy [ nod ] nenul,avemgrijasa crestemvaloareaTree [ nod] cu Lazy [ nod], sa crestemSum[ nod] cu Lazy [ nod ] * ( dr - st + 1 ) ( unde [ st , dr ] este intervalul cucare este etichetat nodul nod) si sa propagam aceastavaloare fiilor.Cualte cuvinte,Lazy[ nod<< 1 ] += Lazy [ nod ] si Lazy [ nod<< 1 | 1 ] += Lazy [ nod ].La final avemgrijasafacemLazy [ nod ] = 0, ceeace semnificafaptul ca am updatatnodul nod. Practic, updatamdoar cand avemnevoie. Complexitatea functiei Push( ) este O ( 1 ).
  • 11. 11 3. Arbori de intervale persistenti Pentrua intelegemai bine notiuneade persistentaincadrul structurilorde date,voi face oparalelaintre persistentasi celebrul "History"al browserelorde cautare dinziuade azi.Sa zicemca intrupe 5 siteuri, numite A,B,C, D si E. Acum vreausa intrupe site-ul care este "launundo"distantade site-ul curent. Acelaeste site-ulD.Acumvreausa intrupe site-ul care este "ladouaundo-uri"distantade site-ul curent.Acelaeste site-ulB.Putemvizualizatotul cape o stivain care facempopla fiecare undosi push la fiecare update. Revenindlaarborii de intervale,saconsideramurmatoareaproblema: "Se da un sir de N elemente.Si unsetde Moperatii.Ooperatie poate fi de tip1, 2, 3, sau 4. Operatiade tip1 cere schimbareavalorii de pe pozitiaposcuo valoare x data. Operatiade tip2 cere interogareaminimuluipe intervalul[a,b]. Operatiade tip3 adauga pe fiecare elementdinintervalul [a,b] ovaloare x data. Operatiade tip4 cere sa se revinalao versiune anterioaraasirului,ignorandu-se ultimele Koperatii de tip1 si 3. Ni se garanteaza de asemeneacaK <= numarul operatiilorde tip1 si 3 anterioare. Restrictii:N ,M <= 2 * 105 Limitade timp: o secundapertest " Am putearezolvaproblemacreeand unarbore de intervale pentrufiecare operatie de tip1sau 3, iar in momentul incare primimooperatie de tip4 sa accesamarborele de intervalesituatdinpunctde vedere cronologiccu K pozitii inainteacelui curent.Aceastasolutie are complexitateaO( N2 * log2N ) si nu se incadreazaintimp.Intr-unconcurs,daca am fi primitaceastaproblemasi am fi rezolvat-ocuaceasta solutie,cuputinnorocam fi obtinut30 de puncte din100. Am aflatincapitolele anterioare calao operatie de tipul 1sau 3, trecemprintr-unnumarlogaritmicde noduri intimpul update-ului.Acestlucrune duce cugandul ca putemfi "greedy",astfelcaputem refolosi nodurilecare nufac parte dinnodurile cucare avemtreaba intimpul update-ului.Ne vine ideea sa ne retinemarborele de intervale cuolistainlantuita,nemaifolosindconventiacafiul stangeste indexul noduluicurentmultiplicatcu2 si fiul drepteste indexul noduluicurentmultiplicatcu2 si adunat cu 1. Astfel unnodnod,are fiul stanganod.lefttsi nodul dreaptanod.rightt. Strategiape care o vomaborda va fi ca de fiecare datacand avemun update,sane copiemnodul curent intr-altul proaspatcreat,iarla fiecare passa returnamrespectivul nod( acestava fi fiul stangasau dreaptaal unui nodsituatpe nivelul imediatsuperior).Putemremarcacamereu,lafiecare update, radacina vafi copiata,iarradacina curentava unic-determinaceamai nouaversiune aarborelui.
  • 12. 12 Ne vine ideeacainmomentul incare trebuie saefectuamooperatie de tip4, tot ce avemde facut este sa folosimradacinade latimpul potrivit.Dacaradacinaarborelui curenteste Root[ n ], atunci radacina de care avemnevoie este Root[ n - k ].Observamca memorianupreaare de suferit,avandnevoie de NlogN memorie. Mai sus este definitiafunctieide duplicare aunui nod,iar mai josdefinitiafunctieide update pe element.Aceastarezolvaoperatiade tip1. Operatiile de tip2si 3 se realizeazasimilarcucele de la versiuneanepersistentaexplicatainpunctul 2.In caz de neclaritati,veti gasi intregcodul inpunctul 4. Legat de complexitate,operatiile de tip1, 2 si 3 se rezolvain O ( log2N), iar operatia de tip 4 inO ( 1 ).
  • 14. 14
  • 15. 15
  • 16. 16
  • 17. 17
  • 18. 18
  • 19. 19
  • 20. 20
  • 21. 21 5. Cateva aplicatii ale arborilor de intervale a ) Aplicatia clasica a arborilor de intervale "Fie un vector A cu N elementenaturale.Asupralui se vorface M operatii,codificateastfel in fisierul deintrare: • 0 a b - Sase determinemaximul dinintervalul [a,b] (maximul dintrevalorile Ai cua ≤ i ≤ b). • 1 a b - Valoareaelementuluidepepozita a va deveni b. Restrictii:N , M <= 2 * 105 Limita de timp: o secunda pertest " Aceasta problema este o aplicatie triviala a arborilor de intervale. Ne vomfolosi doar de clasa "SegmentTree", iar pentru operatia de tip 0, folosimfunctia "RangeQuery", in timp ce pentru operatia de tip 1 folosim functia "ElementUpdate". ComplexitateafinalaesteO( Nlog2N ), ceea ce se incadreaza lejer in limita de timp si obtine 100 de puncte. ( A se studia codul de la punctul 4 ). b ) Aflarea subsirului crescator maximal al unui sir de N numere Cu totii stim problema clasica de programare dinamica care ne cere sa aflam cel mai lung subsir crescator al unui sir de N numere. (Restrictii:N <= 2 * 105 ; Limitade timp: o secundapertest ) 1. Definirea starii : Dp [ i ] = lungimea subsirului crescator maximal care se termina in valoarea i 2. Recurenta : Dp [ i ] = max ( Dp [ i ] , Dp [ k ] + 1 ), cu k de la 1 la i - 1 3.Raspunsul : Max ( Dp [ i ] ), cu i de la 1 la valmax din sir *** Daca Valmax are un ordin de marime exagerat, putem normaliza ( sortam, iar fiecaruinumar ii atribuim in loc de valoarea sa, indicele pozitiei pe care se afla in ordinea sortata; astfel ordinea
  • 22. 22 relativa dintre numerele din sir se pastreaza, iar ordinul de marime al numerelor din sir se micsoreaza semnificativ ( adica devine maxim n ) ) numerele din sir. Complexitatea acestui algoritm implementat intr-un mod brut este O ( N2 ). Totusi, daca studiem atent recurenta, vom remarca faptul ca un arbore de intervale ne-ar usura foarte mult munca. Cu alte cuvinte,putem reduce problema la cea anterioara, la fiecare pas al recurentei facandexact un query si eventual un update. Recurenta se transforma in Dp [ i ] = max ( Arbore.Acces ( 1 , 1 , n , i )/*ceea ce inseamna accesarea elementului de pe pozitia i*/ , Arbore.RangeQuery ( 1 , 1 , n , 1 , i - 1 ) /* ceea ce inseamna maximul pe intervalul [1,i-1] */ + 1 ), complexitateafinala aalgoritmului devenindO( Nlog2N). c ) Aflarea celui de-al K-lea element in ordine sortata dintr- un sir de N numere "Se da un sir de N numere naturale. Sa se afiseze al K-lea element in ordine sortata fara a sorta sirul. ( problema originala este mai complexa, avand si update-uri, ceea cenu ne permite sa preprocesam sortarea sirului )." (Restrictii:N <= 2 * 105 ; Limitade timp: o secundaper test) Vomfolosi unarbore de intervale pe postde vectorde frecventa.Cualte cuvinte,functianoastrade update,nuva fi conceputasa schimbe valoareaunui elementdinsir,ci sa incrementeze valoareaunui elementdinstructuranoastrade date.Pe acestarbore de intervale ne vomtine suma. Este evidentcanumarul de numere care sunt inintervalul [1,x ] <= numarul de numere care sunt in intervalul [1,x+1]. Acestlucrune arata ca sirul sumelorpartiale pe vectorul de frecventaal sirului este crescator,fapt ce ne duce cu gandul la a cauta binar valoareamaximapentrucare sumape intervalul [1,valoare ] este <= cu k.Cautarea binaraare complexitate logaritmica,intimpce query-ul de aflare a sumei pe uninterval inarborele de intervale are aceeasi complexitate.Prinurmare,complexitatea acestei solutii esteO( log2 2N ). Existatotusi si o rezolvare mai eficienta,intimplogaritmic,care rezultadineliminareacautarii binare a valorii.Ce ar fi sa ...cautam binarchiar pe arborele de intervale ?Candsuntemintr-unnodX,noi stim care este sumaintervalului cucare este etichetatfiul saustang/drept.Prinurmare,pentruunKdat, pornimdinradacina,iar lafiecare pasne intrebamdacasuma fiului stangeste mai mare decatK.Daca este mai mare,inseamnaca valoareacautatase aflainsubarborele fiului stang.Incazcontrar, cautam a K - sum[ fiustang] valoare insubarborele fiuluidrept. Reluamprocedeul panacandK ajunge nul. Complexitate finala: O ( log2N ).
  • 23. 23 d ) Problema "Qxy", propusa la PreOji 2016 ( concurs organizat pe Infoarena ) " Fie un şira 1 , a 2 , ..., a n de numerenaturale. Trebuiesărăspundeţi laQ întrebări deforma: date douăpoziţii i şi j şi douănumerenaturalex şi y, câte elemente dinsecvenţaa i , a i+1 , ..., a j au valoareacuprinsăîntrexşi y ? [....]  2 ≤ n ≤ 10000  1 ≤ i ≤ j ≤ n  0 ≤ a[i] ≤1 000  0 ≤ x ≤ y ≤ 1000  1 ≤ Q ≤ 100 000 " Aceasta problema este o aplicatie triviala a arborilor de intervale persistenti. Foarte pe scurt, ne vom creea o noua copie a arborelui la fiecarepozitie i, cu i intre 1 si n. Cand avem un query, este clar ca ne intereseaza doar informatii salvate intre copiile de pe pozitiile i si j. Daca ar fi fostsa ni se ceara numarul valorilor cuprinse intre x si y pe intervalul [ 1, j ], raspunsul ar fi fost suma pe intervalul [x,y] pornind din radacina creata la pozitia j. Aceasta suma cuprinde totusi si suma pentru query-ul pe intervalul [ i, j]. Ne vine ideea sa scadem din suma pe intervalul [ x , y ] la "momentul" j, suma pe intervalul [ x , y ] la "momentul" i -1, folosind practic principiul de la sume partiale. Intr-un mod surprinzator, problema este rezolvata. ComplexitatefinalaO( ( Q + n ) log2Valmax), undeValmaxemax ( a [ i ] ), cu i de la1 la n
  • 24. 24 6. Bibliografie In procesul de creare al acestui atestat, m-am folositde titlurile si continuturile unor probleme de pe www.infoarena.ro,www.codeforces.comsiwww. e-maxx.ru