線段樹(shù)主要的優(yōu)勢(shì)是在將一個(gè)線性的數(shù)組轉(zhuǎn)換成一棵樹(shù),從而減少大量的重復(fù)操作,并且在樹(shù)中的節(jié)點(diǎn)保存一些信息,以便更好的統(tǒng)計(jì)!它的各個(gè)操作的復(fù)雜度都是在logn的,而且我們知道,對(duì)于n個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多是只有2n-1個(gè)樹(shù)的節(jié)點(diǎn),另外對(duì)于一個(gè)如果有maxn個(gè)節(jié)點(diǎn),那么我們知道最多要用4*maxn個(gè)樹(shù)的節(jié)點(diǎn),這個(gè)可以證明

Poj2828 插入隊(duì)列,在這個(gè)過(guò)程中,后一個(gè)人可能會(huì)覆蓋前一個(gè)人,那么如何用線段樹(shù)來(lái)解呢,我們知道線段樹(shù)的葉子節(jié)點(diǎn)代表的就是當(dāng)個(gè)節(jié)點(diǎn)的值,這里,我們把樹(shù)的節(jié)點(diǎn)表示空位的大小,那么在他插入的時(shí)候,然后從后面開(kāi)始插入,那么如果前面出現(xiàn)重復(fù)的,那么因?yàn)榭瘴粩?shù)減少了,那么他們也會(huì)插在后面,插入的根據(jù)是根據(jù)空位的大俠來(lái)的,這個(gè)更新可以這樣寫(xiě)

 Void update(int p,int l,int r,int rt)

{

  當(dāng)前節(jié)點(diǎn)的空位數(shù)減少1

  如果p此時(shí)比他左孩子節(jié)點(diǎn)的空位數(shù)大,那么在往有孩子插入,此時(shí)空位數(shù)p-tree[mid].v

  否則,遍歷左孩子
}

Hdoj 1754 要求的是一段區(qū)間的最大值,這個(gè)在更新的時(shí)候,要不斷更新父子節(jié)點(diǎn),另外在查詢的時(shí)候,其實(shí)對(duì)于每一次,最后的來(lái)的值總是從葉子節(jié)點(diǎn)的來(lái)的,只不過(guò)利用二分的思想,讓他每次都舍棄了一半的選擇!

code

Hdoj1698 hook,這題是用了懶惰標(biāo)記,要求的問(wèn)題是在一段區(qū)間了進(jìn)行了某一個(gè)操作,然后求整個(gè)操作后,總共的和是多少

 懶惰的標(biāo)記是指如果在更新的過(guò)程中,父子節(jié)點(diǎn)已經(jīng)被全部覆蓋,那么作為他的孩子節(jié)點(diǎn)也坐上同樣的標(biāo)記,這個(gè)思想是可以用這樣,首先判斷當(dāng)前節(jié)點(diǎn)有沒(méi)被完全覆蓋,若是,則進(jìn)行懶惰標(biāo)記,對(duì)于他的所有孩子節(jié)點(diǎn)都是如此

code

Hdoj 3577這題的大意就是 火車(chē)有k個(gè)座位,乘客可以買(mǎi)從ab的車(chē)票,給你一些乘客的買(mǎi)票需求,要你求的就是哪些乘客能夠買(mǎi)到票 

  這題用的是線段樹(shù),我們知道最好的情況是在每一條路線上能夠充分的用上,也就是被完全覆蓋,那么在判段許可的時(shí)候,如果此段已經(jīng)被覆蓋過(guò),那么不行!這里有一個(gè)問(wèn)

題就是,因?yàn)橛卸鄠€(gè)座位,所以每個(gè)座位都有一條路線,然后按照上述的思想進(jìn)行處理即可

問(wèn)題:第一次wa,是因?yàn)檫@里沒(méi)注意更新的區(qū)間應(yīng)該是[a,b-1],因?yàn)槲业搅?/font>b站之后,就從這站下來(lái)了,然后下一次是可以從b站出發(fā)的 

code

Poj2528 這一題就是一些海報(bào),要求的是最后沒(méi)有被完全覆蓋的海報(bào)總數(shù), 那么怎么求呢,一個(gè)問(wèn)題就是如果我們按照從一開(kāi)始的數(shù)據(jù)進(jìn)行處理的話,那么前一張海報(bào)可能會(huì)被后一張海報(bào)完全覆蓋,那么最后的結(jié)果就無(wú)法有效求出,那么我們可以反過(guò)來(lái),那就是從最上面的海報(bào)開(kāi)始,那么判斷這段區(qū)間內(nèi)是否已經(jīng)被完全覆蓋過(guò),若是,則不用加1,否則加1

 這題先用離散化,將大的數(shù)據(jù)映射到比較小的數(shù)字上面,然后,根據(jù)離散后的數(shù)據(jù)我們可以得出,現(xiàn)在的問(wèn)題就是,如何求,才能夠去掉被完全覆蓋的區(qū)間,那么這里我們建立一個(gè)hash,這個(gè)hash存放的值是表示第i個(gè)海報(bào),如果查詢的當(dāng)前的節(jié)點(diǎn)的記錄值,在hash表里沒(méi)有被記錄過(guò),那么說(shuō)明此區(qū)間沒(méi)有被完全覆蓋,

 現(xiàn)在證明這樣做的正確性,首先如果前一張海報(bào)被后一張覆蓋的情況,那么由于更新后的cnt[]的域記錄的也是后一張海報(bào)的離散化值,那么就不會(huì)記錄錯(cuò)誤

  總結(jié)上面的過(guò)程,這個(gè)題目的總體思路就是輸入數(shù)據(jù)后,離散處理,在針對(duì)每一個(gè)進(jìn)行更新,最后查詢,代碼待更新。。