版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、清華大學 張昆瑋,統(tǒng)計的力量——線段樹全接觸,2024年3月10日,清華大學 張昆瑋,2,許多算法的本質(zhì)是統(tǒng)計,根據(jù) D. E. Knuth 的分類方法計算機算法可以分為兩類:數(shù)值算法與非數(shù)值算法其中的非數(shù)值算法包括:索引分類統(tǒng)計……,2024年3月10日,清華大學 張昆瑋,3,線段樹?,大家都說:……常數(shù)很大?不好寫?難調(diào)試?想不到?……,2024年3月10日,清華大學 張昆瑋,4,一個悲劇,POJ上的某題
2、,時限很緊……大家都用樹狀數(shù)組,但是有人只會用線段樹呢?而且我可以輕易改出一道不能用樹狀數(shù)組的題在線段樹一次次TLE后,有一個ID發(fā)帖抱怨“下次寫一個匯編版非遞歸線段樹,再超時?”可是大家都知道,超時的代碼已經(jīng)2k了。其實我寫的就是線段樹。很快,而且不到1k。,2024年3月10日,清華大學 張昆瑋,5,線段樹用于統(tǒng)計,運行速度快適應能力強編寫方便結(jié)構(gòu)簡單容易調(diào)試關(guān)鍵在于靈活實現(xiàn),線段樹,從何而來?,為什么在《算
3、法導論》和黑書中都難見到其蹤跡?,2024年3月10日,清華大學 張昆瑋,6,2024年3月10日,清華大學 張昆瑋,7,計算幾何!,計算幾何在長期的發(fā)展中,誕生了許多實用的數(shù)據(jù)結(jié)構(gòu)。區(qū)間查詢,穿刺查詢都是計算幾何解決的問題作為特例中的特例,線段樹解決的問題是:一維空間上的幾何統(tǒng)計高維推廣(kd-tree & …)可以進行正交查詢由于競賽中涉及計算幾何的內(nèi)容有限,不展開,2024年3月10日,清華大學 張昆瑋,8
4、,真正有用的是“點樹”,線段樹把數(shù)軸分成區(qū)間來處理如[8,10), [10,11), …實際上我們面對的往往是離散量競賽中出現(xiàn)的線段樹往往因此退化為“點樹”即,最底層的線段只包含一個點:如:[8,9)中只有整點8而已在之后的討論中,我們不再區(qū)別“點樹”與線段樹,第一印象,如果我給MM的第一印象不到80分的話……是不是老老實實地早點罷手比較好?,2024年3月10日,清華大學 張昆瑋,9,2024年3月10日,清華大學 張
5、昆瑋,10,最經(jīng)典的問題:區(qū)間和,2024年3月10日,清華大學 張昆瑋,11,核心思想:分治,[1,4) in [0,4)左邊,[1,2) in [0,2)Get 1Get [2,4) in [2,4)雖然每次都有可能同時遞歸進入兩棵子樹,但每層實際上只訪問了兩個節(jié)點。為什么?因為查詢是連續(xù)的啊……,其實還有別的核心思想后面再講……,2024年3月10日,清華大學 張昆瑋,12,因為查詢是連續(xù)的?,如果同一層有三個被訪問
6、,依次為A,B,C查詢是連續(xù)的,有了A和C,就一定包括B在樹中的兄弟那我直接用B的父親來計算好了,為什么要用B?,為什么用線段樹?,功利點說,沒啥用的東西咱不學……,2024年3月10日,清華大學 張昆瑋,13,且慢,直接把原數(shù)組處理成前綴和For i=2 to n doA[i] += A[i-1]Ans(a,b) = A[a] - A[b-1],區(qū)區(qū)區(qū)間和,用的著線段樹?,2024年3月10日,清華大學 張昆瑋,14,202
7、4年3月10日,清華大學 張昆瑋,15,這是為什么呢?,原因是區(qū)間和的性質(zhì)非常好滿足區(qū)間減法區(qū)間減法什么的最討厭了!后面再說!不過直接前綴和不是萬能的!如果修改元素的話……,2024年3月10日,清華大學 張昆瑋,16,真正的作用,溝通原數(shù)組與前綴和的橋梁,其實……(其實什么,后面再講),怎么寫?,這個問題,本來是仁者見仁,智者見智的啊但是我要講一點不那么“本來”的東西,2024年3月10日,清華大學 張昆瑋,17,2024年
8、3月10日,清華大學 張昆瑋,18,樸素的遞歸算法,訪問線段如果要的是整條線段就直接返回如果與左子線段相交就遞歸處理如果與右子線段相交就遞歸處理合并所得到的解遺憾的是,這種樸素的方法并不是那么容易實現(xiàn)而且存在嚴重的效率問題(常數(shù)太大),怎么辦?,2024年3月10日,清華大學 張昆瑋,19,TLE,從存儲方式講起,工欲善其事,必先利其器。,2024年3月10日,清華大學 張昆瑋,20,2024年3月10日,清華大學 張昆瑋,
9、21,幾個不那么重要的問題,雖然可以設計出三叉,四叉,……線段樹但是我們先從二叉樹開始登高必自邇,行遠必自卑多叉怎么辦后面再講(這還要講?自己研究去)為了不處理各種特殊情況,假設二叉樹是滿的!不是滿的?你的總區(qū)間是[0,1000)?你就當作[0,1024)不就好了?,2024年3月10日,清華大學 張昆瑋,22,堆式存儲是關(guān)鍵,指針退休了?后面再講……,2024年3月10日,清華大學 張昆瑋,23,一些簡單的問題,N 的
10、左兒子是 2NN 的右兒子是 2N + 1N 的父親是 N >> 1……不就是個堆存儲么?不用講了吧?,2024年3月10日,清華大學 張昆瑋,24,換成二進制看看吧!,2024年3月10日,清華大學 張昆瑋,25,似曾相識?,字母樹!存放的是100,101,110,111四個串!每個節(jié)點存的是以這個節(jié)點為前綴的所有節(jié)點和例:1中存的是所有四個以1開頭的和。似乎從 100 到 111 就正好是原數(shù)組貌似…
11、…下標減 4 就行了?,2024年3月10日,清華大學 張昆瑋,26,好多性質(zhì)啊,有用么?,我們可以直接找到一個數(shù)對應的葉子不用自頂向下慢慢地找啊找“直接加 4 ”多簡單!……直接找到葉子?無限遐想中……,存下來了,然后呢?,可以直接找到葉子?,2024年3月10日,清華大學 張昆瑋,27,2024年3月10日,清華大學 張昆瑋,28,天然的非遞歸方法!,2024年3月10日,清華大學 張昆瑋,29,天然的非遞歸方法!,20
12、24年3月10日,清華大學 張昆瑋,30,這么簡單?,Func Query(s,t) // 詢問從s到t閉區(qū)間s = s – 1, t = t + 1; // 變?yōu)殚_區(qū)間s += M, t += M; // 找到葉子位置While not ((s xor t) == 1) doIf ((s and 1) == 0) Answer += Tree[s + 1];If ((t and 1) == 1) Answer += T
13、ree[t – 1];s = s >> 1, t = t >> 1;,2024年3月10日,清華大學 張昆瑋,31,C語言更簡單!,for (s=s+M-1,t=t+M+1;s^t^1;s>>=1,t>>=1) {if (~s&1) Ans+=T[s^1];if ( t&1) Ans+=T[t^1];},2024年3月10日,清華大學 張昆瑋,32,Warning
14、,在將閉區(qū)間轉(zhuǎn)化成開區(qū)間的時候可能越界1理論上能放 [0,2^N) 的樹其實只能查詢 [1,2^N - 2] 的范圍切記切記,2024年3月10日,清華大學 張昆瑋,33,不要緊張,如果需要查詢 0 就整個向后平移一下所有下標加一!如果需要在[0,1024)中查詢1023結(jié)尾的區(qū)間?慢!你的數(shù)據(jù)規(guī)模不是 1000 么?……如果真的要到1023,直接把總區(qū)間變成[0,2048)就是這么狠!,2024年3月10日,清華大
15、學 張昆瑋,34,修改就更簡單,Func Change(n,NewValue)n += M;Tree[n] = NewValue;While n > 1 don = n >> 1;Tree[n] = Tree[2n] + Tree[2n+1];,2024年3月10日,清華大學 張昆瑋,35,C語言更簡單,for(T[n+=M]=V, n>>=1;n;n>>=1)T[n]=T[n+n
16、]+T[n+n+1];沒了?沒了。,2024年3月10日,清華大學 張昆瑋,36,技術(shù)參數(shù)?,僅使用了兩倍原數(shù)組的空間其中還完整地包括了原數(shù)組構(gòu)造容易:For i=M-1 downto 1 do T[i]=T[2i]+T[2i+1];太好寫了!好理解!自底向上,只訪問一次,而且不一定訪問到頂層實踐中非??欤c樹狀數(shù)組接近為什么呢?后面再講。,2024年3月10日,清華大學 張昆瑋,37,人家樹狀數(shù)組只用一倍空間,因為
17、樹狀數(shù)組依賴于區(qū)間減法區(qū)間減法什么的,最討厭了……后面再講,再講反正如果只問問前綴和,不問區(qū)間和的話那我也可以只用一倍空間!,2024年3月10日,清華大學 張昆瑋,38,天然的非遞歸方法!,2024年3月10日,清華大學 張昆瑋,39,天然的非遞歸方法!,2024年3月10日,清華大學 張昆瑋,40,天然的非遞歸方法!,2024年3月10日,清華大學 張昆瑋,41,所有右兒子沒有用了,2024年3月10日,清華大學 張昆瑋,42
18、,省了一半空間吧,這不就和樹狀數(shù)組一樣了?本來就應該一樣?;剡^頭說,樹狀數(shù)組究竟是什么?就是省掉一半空間后的線段樹加上中序遍歷計算位置需要lowbit什么的我們用的是先序遍歷,符合人的思考習慣。,但是,這個空間沒必要省。費點空間能換來實現(xiàn)的絕對簡單。,2024年3月10日,清華大學 張昆瑋,43,哈哈,2024年3月10日,清華大學 張昆瑋,44,Just For Fun,我之前用這種寫法做過不少題……大家都說我的代碼看
19、不懂我說這就是一個樹狀數(shù)組寫樹狀數(shù)組的人說沒有l(wèi)owbit我說那就算是線段樹吧大家不相信非遞歸的線段樹這么短……我:……,標記的傳遞與收集,懶惰即美德。,2024年3月10日,清華大學 張昆瑋,45,區(qū)間修改,噩夢的開始,2024年3月10日,清華大學 張昆瑋,46,2024年3月10日,清華大學 張昆瑋,47,帶區(qū)間修改的RMQ,RMQ (Range Minimum Query)區(qū)間最小值查詢線段樹支持區(qū)間修改:某一
20、區(qū)間的數(shù)值全部增加一個可正可負的數(shù)暴力修改不靈了!,2024年3月10日,清華大學 張昆瑋,48,四兩撥千斤,在線段樹上的每個節(jié)點增加一個標記表示這一區(qū)間被增加過多少在自頂而下的遞歸過程中如果看到標記,就更新當前節(jié)點的值并將標記下傳嗯?又要自頂向下?,2024年3月10日,清華大學 張昆瑋,49,標記永久化,其實堆式存儲也可以自頂向下訪問就是上下各走一次而已但是我們有更好的辦法(使勁想想就知道了)不再下傳標記,而是隨
21、用隨查在自底向上的查詢過程中每向上走一層,就按照對應的標記調(diào)整答案仔細想想很有道理。我們愿意把盡可能多的信息存放在樹的根部,所以下傳標記做什么?,常數(shù)很?。篛ne Pass,永久化的標記就是值,莊周夢蝶而已,2024年3月10日,清華大學 張昆瑋,50,2024年3月10日,清華大學 張昆瑋,51,染色問題,一根線段,支持區(qū)間染色。詢問區(qū)間是否同色?區(qū)間染色需要使用染色標記1表示紅色,2表示藍色,3綠色,0雜色詢問的時候就
22、直接看標記嘛,2024年3月10日,清華大學 張昆瑋,52,直接看標記?,2為紅色,3為藍色,1為雜色修改3為紅色查詢1,雜色?永久化的標記就是值??!值是自動維護的??!其實我們的修改算法在修改3的時候已經(jīng)維護了1自底向上順便重算所有遇到的節(jié)點標記即可If (Mark[x]==0 and Mark[2x]==Mark[2x+1])Mark[x]=Mark[2x];,2024年3月10日,清華大學 張昆瑋,53,狗拿耗子,貓下
23、崗了,回到區(qū)間修改的RMQ通俗地講,標記就是一個相對的量既然有了標記,值還有什么用?或者說,如果值本身就是相對的,還需要標記?如果我讓所有的數(shù)都從零開始變化,那標記永久化之后,所有值都恒為零啊!于是我們連值也不存了。永久化的標記就是值。,2024年3月10日,清華大學 張昆瑋,54,什么意思?,每個節(jié)點不存區(qū)間最大值T[n]了存放M[n]=T[n]-T[n>>1]讓每一個節(jié)點的值都減除它父親的值區(qū)間修改就直
24、接改M[n]。查詢就是從要查的節(jié)點開始一直加到根。T[n]=M[n]+M[n>>1]+…+M[1];遇到節(jié)點x,則 A=min(M[2x],M[2x+1])M[x]+=A,M[2x]-=A,M[2x+1]-=A,2024年3月10日,清華大學 張昆瑋,55,簡單……,Func Add_x(s,t,x)for (s=s+M-1,t=t+M+1;s^t^1;s>>=1,t>>=1) {if (
25、~s&1) T[s^1]+=x;if ( t&1) T[t^1]+=x;A=min(T[s],T[s^1]),T[s]-=A,T[s^1]-=A,T[s>>1]+=A;A=min(T[t],T[t^1]),T[t]-=A,T[t^1]-=A,T[t>>1]+=A;},2024年3月10日,清華大學 張昆瑋,56,too 簡單,too,Func Max(s,t)for (s=s+M-1,
26、t=t+M+1;s^t^1;s>>=1,t>>=1) {LAns+=T[s],Rans+=T[t];if (~s&1) LAns=max(LAns,T[s^1]);if ( t&1) RAns=max(RAns,T[t^1]);}Ans = max(LAns,RAns);while (s>1) Ans += T[s>>=1];,2024年3月10日,清華大學 張昆瑋
27、,57,啟示,差分是化絕對為相對的重要手段標記永久化后就是值,只不過這種值是相對的計算答案時可以利用從節(jié)點到根部的信息,2024年3月10日,清華大學 張昆瑋,58,alternative,截至PPT制作時,大家用的線段樹自頂向下居多在自頂向下的線段樹中,標記往往不是永久化的對于RMQ,需要下傳標記對于染色問題,需要下傳并收集標記思想與這里我的方法差不多,實現(xiàn)上差別較大至少上下各訪問一次,較慢參見其他資料,2024年3月
28、10日,清華大學 張昆瑋,59,還一個欠賬,線段樹是連接原數(shù)組和前綴和的橋梁橋梁兩邊同時取差分前綴和與差分互為逆運算因此線段樹也是連接差分和原數(shù)組的橋梁如果要支持區(qū)間修改,單點查詢無需使用標記,直接將原數(shù)組差分用線段樹維護差分數(shù)組的前綴和即可。,其實什么……現(xiàn)在可以講了,2024年3月10日,清華大學 張昆瑋,60,前綴和的前綴和?,不借助標記,支持區(qū)間修改和區(qū)間求和(原創(chuàng))先差分后變成維護一個前綴和的前綴和……別被嚇
29、到,前綴和的前綴和是什么SS1 = S1 = x1SS2 = S1+ = 2x1+x2SS3 = S1+S2+S3 = 3x1+2x2+x3 =4(x1+x2+x3)-(1x1+2x2+3x3)多維護一個{nxn}的前綴和就行了。,數(shù)學啊數(shù)學!,2024年3月10日,清華大學 張昆瑋,61,最長上升區(qū)間列,最長上升“區(qū)間列”在一個區(qū)間列中按順序找出最多區(qū)間使得不重疊,單調(diào)增如
30、 [1,3] [2,4] [4,5] 答案是[1,3]+[4,5]動態(tài)規(guī)劃的可行決策是什么呢?如果要使上升列長度大于x,最后一個數(shù)最小是多少,記為f[x]維護f[x]支持點查詢和區(qū)間修改。,2024年3月10日,清華大學 張昆瑋,62,前綴min的逆運算,點查詢:查詢x處f[x]的值區(qū)間修改:x左邊的所有超過K的值,變?yōu)镵把x的左右換一下……(囧)整個f[-x]就是單調(diào)減的一個單調(diào)減的序列可以看作是由一個普通序列經(jīng)過前
31、綴min得到的!前綴min的逆運算是什么呢?我們并不關(guān)心,2024年3月10日,清華大學 張昆瑋,63,這樣也行?,我們現(xiàn)在要維護的就是前綴min的逆運算后的原序列!可是我們甚至不知道前綴min的逆運算是什么不要緊,反正用不到。點查詢:查詢x處f[x]的值直接返回維護序列的前綴min區(qū)間修改:x左邊的所有超過K的值,變?yōu)镵把維護序列中的f[x]變?yōu)镵,線段樹,太靈活了!,2024年3月10日,清華大學 張昆瑋,64,但
32、是不要迷信線段樹,不要迷戀哥,哥只是個傳說……,2024年3月10日,清華大學 張昆瑋,65,2024年3月10日,清華大學 張昆瑋,66,重要條件:區(qū)間加法,說了這么多,能使用線段樹解決問題的關(guān)鍵:區(qū)間加法,即區(qū)間的“性質(zhì)”由子區(qū)間完全決定包括但不僅限于求和,求最值,求染色狀態(tài)這里的“性質(zhì)”有點像動態(tài)規(guī)劃的狀態(tài)表示有時候,求的更多反而更容易最簡單的例子:求區(qū)間第二最值如果實在不滿足區(qū)間加法,就全完了,2024年3月10日,
33、清華大學 張昆瑋,67,不滿足區(qū)間加法?,我們都知道線段樹求區(qū)間平均值不難那求一個區(qū)間中位數(shù)試試?什么,還不難?那你再求個眾數(shù)?……,2024年3月10日,清華大學 張昆瑋,68,不滿足區(qū)間加法!,越來越難的原因很簡單知道兩區(qū)間的中位數(shù),就知道和區(qū)間的中位數(shù)?知道各自眾數(shù)有什么用?……,2024年3月10日,清華大學 張昆瑋,69,超越中位數(shù)K-th number,給定一列數(shù),反復求區(qū)間第k大數(shù)。要求的更多反而更容易…
34、…更容易……線段樹的每個區(qū)間必須保留更多的信息!每個區(qū)間中存下區(qū)間所有數(shù)的有序數(shù)組通過歸并完成區(qū)間加法,2024年3月10日,清華大學 張昆瑋,70,歸并很慢,如果每做一次查詢就歸并若干個線段復雜度就會達到O(n)離散化!二分答案!變?yōu)榍螅簒是區(qū)間第幾大數(shù)?這可以分別二分查找若干線段得到??倧碗s度O(nlogn+Q*log2n),另一種原創(chuàng)方法,后面再講,2024年3月10日,清華大學 張昆瑋,71,區(qū)間減法,如果有
35、了區(qū)間減法……線段樹就能如虎添翼如“區(qū)間和”變成“前綴和”操作能簡單不少同時也是能夠使用樹狀數(shù)組的條件但這不是必需的(和區(qū)間加法比一比),另一種核心思想,我說過后面要講的嘛,2024年3月10日,清華大學 張昆瑋,72,2024年3月10日,清華大學 張昆瑋,73,堆?,維護一個數(shù)據(jù)結(jié)構(gòu)支持整數(shù)插入取最大整數(shù)范圍是0~65535好了,2024年3月10日,清華大學 張昆瑋,74,劉汝佳老師的大招,堆當然可以但是劉汝佳老
36、師的黑書上有大招!“分段哈?!薄殖扇舾啥?,存下“段里面有沒有數(shù)”信息,2024年3月10日,清華大學 張昆瑋,75,分段哈希,2024年3月10日,清華大學 張昆瑋,76,多來幾層如何,如果多來幾層呢?3層?4層?……到每個節(jié)點下面都只有兩個點為止!……我們得到了什么……,2024年3月10日,清華大學 張昆瑋,77,這也是線段樹,2024年3月10日,清華大學 張昆瑋,78,哈哈,平衡樹 vs 線段樹,不要折騰……,2
37、024年3月10日,清華大學 張昆瑋,79,2024年3月10日,清華大學 張昆瑋,80,一種似曾相識的感覺,維護一個數(shù)據(jù)結(jié)構(gòu)支持整數(shù)插入整數(shù)刪除取第k大的數(shù)(取最大最小什么的就不說了)查詢數(shù)的排名查某數(shù)是否存在允許元素重復(為了難一點)整數(shù)范圍是0~65535好了,2024年3月10日,清華大學 張昆瑋,81,統(tǒng)計的力量!,平衡樹么?線段樹!統(tǒng)計[0,65536)每個數(shù)的出現(xiàn)頻率,記為f[x]整數(shù)插入,f[x]++
38、整數(shù)刪除,f[x]--查詢數(shù)的排名,求前綴和取第k大的數(shù)(取最大最小什么的就不說了)給定前綴和,查找自頂向下,左邊不夠就向右走,否則向左。,2024年3月10日,清華大學 張昆瑋,82,事半功倍,實測得到線段樹用來處理這類問題非??炱胶鈽渲凶羁斓腟ize Balanced Tree用了4秒多線段樹不到半秒全部出解。這還沒有分別減去讀入數(shù)據(jù)的時間。線段樹使用剛剛所講的實現(xiàn),代碼量極小,且調(diào)試非常簡單。,2024年3月10
39、日,清華大學 張昆瑋,83,如果數(shù)據(jù)范圍大呢?,離散化。不能離散化?呵呵……后面再講,2024年3月10日,清華大學 張昆瑋,84,一種似曾相識的感覺,維護一個數(shù)據(jù)結(jié)構(gòu)支持字符串插入字符串刪除取第k大的字符串(取最大最小什么的就不說了)查詢字符串的排名查某字符串是否存在,2024年3月10日,清華大學 張昆瑋,85,帶size域的字母樹,這里的size域的維護方式和線段樹如出一轍!排名的計算方法,和之前整數(shù)的線段樹完
40、全一樣如果把字符串看作26進制數(shù)那字母樹就是線段樹?,2024年3月10日,清華大學 張昆瑋,86,哈哈,2024年3月10日,清華大學 張昆瑋,87,那為啥字母樹省空間?,所有節(jié)點用指針記錄兒子空間隨用隨開不是滿二叉樹,甚至不完全自頂向下處理所有問題線段樹也可以這樣數(shù)據(jù)范圍再大,能比26^N還大?,2024年3月10日,清華大學 張昆瑋,88,線段樹處理long int,就是一棵三十二層高的線段樹指針式存儲,節(jié)點像字
41、母樹一樣動態(tài)生成支持插入刪除選擇等等……復雜度是O(NlogM),M是最大的數(shù)對于long int,M=32實測用了一秒多(還記得平衡樹四秒多么?)自頂向下,只算前綴和,也不難寫,不就是個二進制的字母樹?,2024年3月10日,清華大學 張昆瑋,89,可能的改進,像壓縮字母樹一樣,會節(jié)約大量空間代價:不好寫了刪除一個數(shù)之后嘗試回收已經(jīng)分配的節(jié)點代價:略慢,不好寫了樹高動態(tài)化初始樹高是1,只能放0每一次如果要放的數(shù)
42、太大,增加一個根根的左兒子是當前的根,右兒子空。這個還實用!,平衡樹 with 線段樹,在天愿作比翼鳥,在地愿為連理枝,2024年3月10日,清華大學 張昆瑋,90,2024年3月10日,清華大學 張昆瑋,91,記得Size域么?,平衡樹上很多信息可以像線段樹一樣維護平衡樹就是一個會旋轉(zhuǎn)的動態(tài)線段樹!最簡單的,比如size域,2024年3月10日,清華大學 張昆瑋,92,NOI2005 維護數(shù)列,塊狀鏈表的傷心題,標準程序5
43、k+維護一個數(shù)列,支持:區(qū)間增加一個數(shù)區(qū)間刪除區(qū)間插入?yún)^(qū)間求和區(qū)間翻轉(zhuǎn),2024年3月10日,清華大學 張昆瑋,93,平衡樹與線段樹,平衡樹 splay 可以支持:區(qū)間刪除區(qū)間插入線段樹可以支持區(qū)間增加一個數(shù)區(qū)間求和把線段樹的值放在平衡樹的節(jié)點上,2024年3月10日,清華大學 張昆瑋,94,轉(zhuǎn)起來的線段樹,每個節(jié)點表示它和子樹的信息總和平衡樹旋轉(zhuǎn)時更新線段樹的域哇,會動的線段樹……,2024年3月10日,清
44、華大學 張昆瑋,95,標記啊標記,既要區(qū)間修改又要區(qū)間求和使用自頂向下的標記下傳即可為了處理區(qū)間反轉(zhuǎn)增設一個bool值表示當前節(jié)點左右子樹已經(jīng)互換先把區(qū)間從樹中splay出再處理要同時更改所有節(jié)點的反轉(zhuǎn)標記?不記錄反轉(zhuǎn)標記,記錄反轉(zhuǎn)標記的標記(!),2024年3月10日,清華大學 張昆瑋,96,好綜合的一道題,但是所有部分都是相對簡單的!一點點寫,只是很多很多小題而已……,返璞歸真,關(guān)于線段樹,我們講的已經(jīng)太多了……,2
45、024年3月10日,清華大學 張昆瑋,97,2024年3月10日,清華大學 張昆瑋,98,再還一個欠賬,K-th number 的另一個方法如果區(qū)間互不包含,將所有要求的區(qū)間排個序來算。用平衡樹或線段樹存下當前區(qū)間中的數(shù)然后向下一個區(qū)間移動左端點增加是數(shù)的刪除右端點增加是數(shù)的添加每個數(shù)進出各一次而已,2024年3月10日,清華大學 張昆瑋,99,如果相互可以包含呢?,關(guān)鍵在于合理的計算方式使得相鄰區(qū)間的差異盡量小從一個
46、區(qū)間變?yōu)榱硪粋€區(qū)間的代價是多少?把區(qū)間看作二維平面的坐標代價就是兩個平面點的Manhattan距離!然后呢?Hamilton路?不!一個已知的區(qū)間可以用來算很多個未知的!平面圖Manhattan距離最小生成樹。,2024年3月10日,清華大學 張昆瑋,100,然后呢?,平面圖Manhattan距離MST可以在O(nlogn)求出先對Q個問題用這個方法處理再按照MST的順序和方法實際計算求數(shù)學大牛分析總復雜度雖然繞了很
47、多彎路,但是有一種用模型解決實際問題的感覺。居然MST還能用來做預處理呢……,2024年3月10日,清華大學 張昆瑋,101,最后的硬骨頭,眾數(shù),聽了這么久,一起做一道練習題吧……給定一列n個數(shù),和m個區(qū)間,求每個區(qū)間里的眾數(shù)出現(xiàn)了多少次。對于10%的數(shù)據(jù)n<100, m<100對于30%的數(shù)據(jù)n<1000,m<1000對于50%的數(shù)據(jù)n<100000,m<100000對于70%的數(shù)據(jù)n&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論