You are on page 1of 7

tuoitrekthc

Zealwithoutknowledgeisfirewithoutlight.

IntervalTree

Cykhong(Intervaltree).
Lcydnglutrcckhongsnguyntrntrcsvicccimcacckhong(nhtngcc
phnttrongkhong,phntlnnht,nhnhttrongkhong,).Cmtscchtchccy
khong.Sauylcchtchccykhongtrn2mngmtchiu:
Mintcacyqunlmtoncadygm:phntuvcuicaon,tngccphntca
dytrongon,shiucant.NtAqunlon[left,right]licchiathnhhaintconBv
C,ntBlntcontriqunlon[left,mid]vntClntconphiqunlon[mid+1,right]
(trongmid=(left+right)div2).Ccntlchqunlonchang1phnt.
Vdqunldys{1,2,3,4,5}cthxydngcykhongnhsau:Ntgcmangshiu1
qunlc5phnttchs0nchs4,ntgcchaintcon:ntcontrimangshiu2qun
l3phnttchs0nchs2,ntconphimangshiu3qunl2phntcchs3v4,
trongmintcnlugisumltngccphntdontqunl.

(hps://tuoitrekthc.les.wordpress.com/2015/01/caykhoang.jpg)
citcy,cthdngmngmtchiuTvmngmtchiuP,viT[d]ltngccphnt
trongondontcshiudqunl,P[i]lshiucantlchaphntA[i].Chcnqunl
shiuccntl,vtshiuccntlcthsuyrashiuccntcnli.
Cykhongthngcdngkhidliuccpnhtthngxuyntrongqutrnhthchin
chngtrnh.
Vicxydngchitithaimngnyxemtronghngdncabitpsauy:
Biminhhasdngcykhong.Trliccyucu
ChomtdysA(0..N1)gmNsnguynnhst0nN1lA[0],A[1],,A[N1].XtMyu
cugmhailoi:
Cij:Thayphntthibnggitrj.
Qij:Xutratngccphnttrongdystvtrinvtrj
Nhimv:ChotrcdysA(0..N1)vMyucutronglevnbnHOIDAP.IN.Hythchin
ccphpbinitrndyvxutccktquraleHOIDAP.OUT
Giihn:1N10000;|Ai|1000,M100000
FileinputHOIDAP.INcdngutincha2snguynNvM.Dngthhaichaccphnt
cadyA(0..N1).Mdngcui:midngchamtyucu.
FileoutputlHOIDAP.OUTgmmtsdngtngnglktqucaccyucuQtrongle
input.
Vd
HOIDAP.IN

HOIDAP.OUT

53

12345

17

Q23
C37
Q14
Hngdn.
Xydngcykhongcccllccphntcadys,ntgcqunltonbnphnt(nghal
qunlon[0;n1]).Dngmngplushiuccntl,mngtlutngccphntcaondo
ntqunl.
Hmquisohieunut(left,right,d)xydngshiuntchoccntlluvomngp:
voidsohieunut(intl,intr,intd){
//Toshiuchoccl,bitntqun[l;r]cshiuld
intm;
if(l==r)p[l]=d;//Xcnhnshiuntl
else{//Challthquytipxthaintcon
m=(l+r)/2;
sohieunut(l,m,2*d);
sohieunut(m+1,r,2*d+1);
}
}
Ligibanusohieunut(1,n,1)thchinqui,banuginhshiuntgcld=1.Shiu
ntcontril2*d,shiuntconphil2*d+1.iukindngcaquilgplvgnshiu
canttrncychontl.Chclmicngnshiunt,shiuccnttrongcacykhng
cnluvkhibitshiuntconsuyngayrashiuntchacan(nuquinhshiuntgcl
1thntchacantcshiuilntcshiuidiv2),vvykhibitshiuccntl,ingc
vgcstnhcshiuccnttrong.
Sauqutrnhquiny,rrngntlbitcc3tnhchtcaondontnyqunll:
vtrphntuvcuicamton(haivtrnytrngnhau),tngccphntcaon(chnh
lgitrphntduynht),shiucant.ChT[p[i]]=A[i].(p[i]lshiuntlqunlphnt
A[i]).
Bngtipcnboomup,ingctccntllnphagc,stnhctngccphntthuc
ondotngnttrnqunl(nghalxydngxongmngT).
Saukhixydngxongcy(nghalcitxongmngTvP)cnxydnghaiphpton:php
cpnhtligitrmtphntcamngvphptnhtngccphntcamtontu.
Phpcpnhtlimtphntcamng:Giscncpnhtgitrphnti,thtntlcshiu

Phpcpnhtlimtphntcamng:Giscncpnhtgitrphnti,thtntlcshiu
p[i],ingcvgc,ddngcpnhtliccgitrtngngcaT[j]vijlshiucaccnt
chatrnngivgc.
voidcapnhat(inti,intvalue){//Cpnhtphntthicady
intj=p[i];//Shiucalchaphnti
t[j]=value;//Cpnhtligitrtl(cshiuj)
while(j>1){//Cpnhtccntchatrnngvgc
j=j/2;
t[j]=t[2*j]+t[2*j+1];
}
}
Phptnhtngcaccphntcamtontu[i;j]:taxydnghmquisum()tmkimon
[i;j]trncy.Trctinton[i;j]vogc,sautmngivl,nnt[left=i;right=j]th
dngvxutragitrtngccphntcantny.Tmkimntqunlon[i..j]trncyInterval
bngtmkimnhphn.Gistmnntqunlon[left;right]cshiuntld,tmid=
(left+right)div2,xt3trnghp:
Mid>j:thon[i,j]thucon[left;mid]cshiu2*d
Mid<i:thon[i,j]thucon[mid+1;right]cshiu2*d+1
Trnghpcnli,taschiaon[i;j]thnhhaionl[i;mid]v[mid+1;j]tngngcs
hiu2*dv2*d+1.
intsum(inti,intj,intl,intr,intd){
intm,temp=0;
if((i==l)&&(j==r))
returnt[d];//gpntqunlon[i;j]thxutratng
//nuchagpnt[i;j]thtmkimntnybngtmkimnhphn
m=(l+r)/2;
if((m<i)&&(i<=j))
temp=sum(i,j,m+1,r,2*d+1);
elseif((i<=j)&&(j<=m))
temp=sum(i,j,l,m,2*d);
else
temp=sum(i,m,l,m,2*d)+sum(m+1,j,m+1,r,2*d+1);
returntemp;
}

}
Chngtrnh
#include<fstream>
#include<vector>
#denemaxn1000
usingnamespacestd;
vector<int>p,t;
ifstreamn(hoidap.in);
ofstreamfout(hoidap.out);
intn,m,u,v,value;
charch;
voidsohieunut(intl,intr,intd){//Toshiuchoccl
intm;
t[d]=0;
if(l==r)p[l]=d;
else{
m=(l+r)/2;
sohieunut(l,m,2*d);
sohieunut(m+1,r,2*d+1);
}
}
voidcapnhat(inti,intvalue){//Cpnhtphntthicady
intj=p[i];//Shiucalchaphnti
t[j]=value;//Btucpnhtligitrtl(cshiuj)
while(j>1){//Cpnhtccntchatrnngvgc
j=j/2;
t[j]=t[2*j]+t[2*j+1];
}
}
//Tnhtngccphnttrong[i;j]bngcchtnvogcrichoixung

//Tnhtngccphnttrong[i;j]bngcchtnvogcrichoixung
intsum(inti,intj,intl,intr,intd){
intm,temp=0;
if((i==l)&&(j==r))
returnt[d];//gpntqunlon[i;j]thxutratng
//nuchagpnt[i;j]thtmkimntnybngtmkimnhphn
m=(l+r)/2;
if((m<i)&&(i<=j))temp=sum(i,j,m+1,r,2*d+1);
elseif((i<=j)&&(j<=m))temp=sum(i,j,l,m,2*d);
else
temp=sum(i,m,l,m,2*d)+sum(m+1,j,m+1,r,2*d+1);
returntemp;
}
intmain(){
fin>>n>>m;//sphntcadys,syucucntrli
p.resize(n,0);//Khitrccvectorpvt
t.resize(10*n,0);
sohieunut(0,n1,1);//Toshiuchoccl
for(inti=0;i!=n;i++){//Cpnhtccphntvocykhong
fin>>value;
capnhat(i,value);
}
for(inti=1;i<=m;i++){//Lnltcccyucu
fin>>ch>>u>>v;
if(ch==Q)//xutratngccphnttrongon[u,v]
fout<<sum(u,v,0,n1,1)<<endl;
else
if(ch==C)
capnhat(u,v);//thchincpnhtliphntu
}

}
return0;
}
Tomtwebsiteminphhoc1blogviWordPress.com.

You might also like