線段樹應(yīng)用和實(shí)現(xiàn)總結(jié)(持續(xù)更新)

應(yīng)用情況

線段樹非常通用沪饺,是基于分治思想的二叉樹怜姿。區(qū)間查詢問題一般都可以試試(一般沒有沒有單點(diǎn)查詢的),有單點(diǎn)修改和區(qū)間修改砌创。有些問題甚至可以離散化轉(zhuǎn)換成區(qū)間問題虏缸。(待驗(yàn)證。)

值域線段樹的重要誤區(qū)

值域線段樹以值本身作為下標(biāo)嫩实,值的出現(xiàn)次數(shù)存在線段樹里刽辙。值域線段樹和普通的線段樹的區(qū)別只是用例的使用方式的區(qū)別,而根據(jù)這種不同的應(yīng)用方式才把這類線段樹分類叫做值域線段樹而已甲献。因此線段樹的內(nèi)部實(shí)現(xiàn)絲毫不受影響扫倡。因此在開發(fā)值域線段樹時(shí)一定封裝,不受用例的使用方式的干擾竟纳,而時(shí)刻注意線段樹提供的接口撵溃。

接口設(shè)計(jì)

  1. 添加和刪除往往可以合并,只是正負(fù)的問題
  2. 詢問全局的答案也就是詢問root節(jié)點(diǎn)的答案

內(nèi)部實(shí)現(xiàn)的總設(shè)計(jì)思路

既然是分治思想的線段樹锥累,查什么缘挑,保存什么(通常),再存一下分治合并時(shí)需要的信息即可桶略。區(qū)間被完全覆蓋的優(yōu)化是時(shí)間復(fù)雜度的保證语淘,因此思考查詢與修改時(shí)區(qū)間被完全覆蓋滓侍、和非完全覆蓋合并時(shí)的兩種情況如果更新广鳍,當(dāng)然也可以考慮子節(jié)點(diǎn)(優(yōu)先考慮葉節(jié)點(diǎn))如何更新父節(jié)點(diǎn)。一定記住葉節(jié)點(diǎn)一定被完全覆蓋膝蜈。實(shí)現(xiàn)時(shí)一定銘記向下遞歸一定是有選擇性的操作 鹅心。
綜上:

  1. 查什么吕粗,保存什么。思考葉節(jié)點(diǎn)儲(chǔ)存的信息
  2. 思考父節(jié)點(diǎn)如何由子節(jié)點(diǎn)更新而來(lái)旭愧,考慮額外的維護(hù)信息
  3. 考慮修改查詢操作的完全覆蓋和非完全覆蓋(深知葉節(jié)點(diǎn)一定被覆蓋)

具體實(shí)現(xiàn)

  1. 建樹颅筋。常常我們會(huì)對(duì)一個(gè)區(qū)間建樹宙暇。
//這是掃描線的代碼
    void build(int u, int e, int o)
    {
        l[u]=e; r[u]=o; //左右端點(diǎn)賦值
        if(e==o-1) return; //判葉節(jié)點(diǎn)
        umid; //向下遞歸
        build(ul, e, mid);
        build(ur, mid, r);
    }
  1. 區(qū)間操作:判斷操作區(qū)間與當(dāng)前節(jié)點(diǎn)區(qū)間的包含關(guān)系:完全覆蓋,非完全覆蓋(傳標(biāo)記议泵,左右選擇遞歸占贫,合并更新)
//這是掃描線的代碼
    void modi(int u, int e, int o, int d)
    {
        //既然是分治的線段樹結(jié)構(gòu) ,查什么先口,保存什么型奥。
        //區(qū)間被完全覆蓋的優(yōu)化是時(shí)間復(fù)雜度的保證。
        //一定是有選擇性的操作 
        if(e<=l[u]&&r[u]<=o) times[u]+=d; //被覆蓋
        else //沒被覆蓋碉京,討論下遞歸
        {
            umid;
            if(e<=mid) modi(ul, e, mid, d);
            if(o>mid) modi(ur,  mid, r, d);
        } 
                //合并更新
        if(times[u]) width[u] = raw[r[u]] - raw[l[u]];
        else width[u] = width[ul] + width[ur];
    }
//這是區(qū)間求和的板子厢汹,
    int query(int p, int e, int o)
    {
        if(e<=l[p]&&r[p]<=o) //先判斷完全覆蓋
            return sum[p];
                //非完全覆蓋
        spread(p); //有標(biāo)記時(shí)先下傳,選擇性的合并
        pmid;
        int ans = 0;
        if(e<=mid) ans+= query(pl, e, o);
        if(o>mid) ans+= query(pr,e,o);
        return ans;
    }
  1. 單點(diǎn)修改:葉節(jié)點(diǎn)直接修改更新收夸,其他節(jié)點(diǎn)選一邊遞歸下去再合并更新。

各種不同維護(hù)信息的例題模板

  1. 區(qū)間乘加血崭,區(qū)間求和
  2. 區(qū)間并
  3. 求區(qū)間最值

下面還有亟待解決的更難問題卧惜,也代表了即將學(xué)習(xí)平衡樹和樹套樹。

曾老的OJ上有許多例題夹纫。

  1. 單點(diǎn)修改咽瓷,區(qū)間第k小
  2. 索引單點(diǎn)插入,求最終隊(duì)列

靈活多變的線段樹

實(shí)際上線段樹非常靈活:可以維護(hù)離散的序列舰讹,也可以維護(hù)真正的一維幾何區(qū)間(例如掃描線)茅姜。

空間限制

可以動(dòng)態(tài)開點(diǎn)和線段樹合并,勢(shì)能分析可得總體復(fù)雜度是線性對(duì)數(shù)的月匣。
也可以離散化(貌似就不能在線了)钻洒。

正在更新

帶著走還是儲(chǔ)存邊界?

如果沒有初值锄开,那就懶得建樹素标,那我就直接帶著走算了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萍悴,隨后出現(xiàn)的幾起案子头遭,更是在濱河造成了極大的恐慌,老刑警劉巖癣诱,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件计维,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撕予,警方通過查閱死者的電腦和手機(jī)鲫惶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)实抡,“玉大人剑按,你說我怎么就攤上這事疾就。” “怎么了艺蝴?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵猬腰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我猜敢,道長(zhǎng)姑荷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任缩擂,我火速辦了婚禮鼠冕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胯盯。我一直安慰自己懈费,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布博脑。 她就那樣靜靜地躺著憎乙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叉趣。 梳的紋絲不亂的頭發(fā)上泞边,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音疗杉,去河邊找鬼阵谚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烟具,可吹牛的內(nèi)容都是我干的梢什。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼朝聋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绳矩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玖翅,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翼馆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后金度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體应媚,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年猜极,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了中姜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丢胚,靈堂內(nèi)的尸體忽然破棺而出翩瓜,到底是詐尸還是另有隱情,我是刑警寧澤携龟,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布兔跌,位于F島的核電站,受9級(jí)特大地震影響峡蟋,放射性物質(zhì)發(fā)生泄漏坟桅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一蕊蝗、第九天 我趴在偏房一處隱蔽的房頂上張望仅乓。 院中可真熱鬧,春花似錦蓬戚、人聲如沸夸楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豫喧。三九已至,卻和暖如春痛单,著一層夾襖步出監(jiān)牢的瞬間嘿棘,已是汗流浹背劲腿。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工旭绒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焦人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓挥吵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親花椭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忽匈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容