【總結】線段樹合併雜題

bzoj1483: [HNOI2009]夢幻布丁

每個顏色建一顆線段樹,改色就是暴力合併兩個顏色的線段樹,維護連續區間個數即可。

p.s 也可以鏈表合併做


2212: [Poi2011]Tree Rotations

從葉子節點向上,計算swap(lchild,rchild)swap(lchild,rchild)後的逆序對個數和原來的逆序對個數,貪心換/不換。

計算逆序對個數可以線段樹以權值爲下標處理

p.s 也可以splaysplayO(nlog2n)O(n\log ^2 n)


BestCoder Round #52 (div.1) 3.Victor and Proposition

建圖連邊求SCC,設第ii個SCC大小爲爲cnticnt_ians=(cnti2)ans=\sum{cnt_i\choose 2}

問題似乎是深度差不超過did_i而不是標號(其實也沒什麼區別,下面就按深度來)

線段樹優化連邊:
對於每個點的子樹維護以深度爲下標的線段樹,iixix_i的線段樹[dep[xi],dep[xi]+di][dep[x_i],dep[x_i]+d_i]連邊。

至於每個點的線段樹:可以對葉子結點都建立一顆,每次線段樹合併上去即可。


SPOJ COT6

沒有找到原題…

題意:
稱有根樹的一條路徑爲直鏈當且僅當路徑上任意兩點都存在祖孫關係。
現在給定一顆頂點帶權的有根樹,要求把它劃分成若干直鏈,使得每條直鏈的權和的平方和最小。
每個頂點的權都是整數,保證任意直鏈的權和都在intint範圍內,答案不超過1e161e16

口胡題解(???):

記錄每個點到根的點權和wiw_i

考慮選出根到結點xx的直鏈後將樹劃分成了若干森林(根到xx的路徑上的若干兄弟結點子樹&xx的所有兒子結點子樹),故設dp[i]dp[i]表示ii子樹的最優值,sum[i]=jsonidpjsum[i]=\sum\limits_{j\in son_i}dp_jg[i][j]g[i][j]表示ii子樹中去掉iji\to j路徑的點後的森林的最優值。

爲方便表示,設belxbel_x表示當ii爲根時,結點xxbelxbel_x的子樹內(belxbel_xii的兒子結點)。

轉移:
g[i][x]=g[belx][x]+sum[i]dp[belx]g[i][x]=g[bel_x][x]+sum[i]-dp[bel_x]
dp[i]=min(g[i][x]+(wxwfai)2)dp[i]=min(g[i][x]+(w_x-w_{fa_i})^2)

拆分系數:dp[i]=wfai2+min(2wfaiwx+g[i][x]+wx2)dp[i]=w_{fa_i}^2+min(-2w_{fa_i}w_x+g[i][x]+w_x^2)

考慮對於所有xx,表示成平面上(wx,g[i][x]+wx2)(w_x,g[i][x]+w_x^2)的點,維護下凸殼,斜率爲2wfai2w_{fa_i}的直線與下凸殼切線的截距就是dpidp_i

於是問題轉化成了對於每個點維護一些點的下凸殼,每次將所有點整體向上平移一定距離,並與兄弟結點的凸殼合併。

BSTBST啓發式合並可以O(nlog2n)O(n\log ^2n)處理。

但這裏探討一下線段樹合併的做法:

線段樹下標爲離散化後xx座標。

同一個位置的合併對yymin\min即可,而對於兩段x軸上射影不相交的下凸殼((l,mid)&(mid+1,r)(l,mid)\& (mid+1,r)),維護葉子結點的雙向鏈表和相鄰點的向量,線段樹每個結點記錄範圍內凸殼上最左和最右的點,合併中間即可。

複雜度O(nlogn)O(n\log n)


SPOJ COT7

同找不到原題…

題意:
有根樹每個點有兩個權c和w,仍然是直鏈劃分,最小化w和的最小平方和。
劃分出的直鏈c的和必須在給定範圍[L,R]內。
保證任意直鏈的c和與w和都是int範圍內的整數

口胡題解(???):

比6多了一維的限制。
同樣維護點到根的cc的和tit_i
大概是把tit_i離散化之後在線段樹上多套一維吧。。。
咕咕咕


SPOJ AE5A2

SAMSAM+線段樹合併把每個結點的rightright集合求出來。

節點ii的線段樹中維護相鄰兩個出現位置之間的最大值disidis_i(線段樹節點維護最左最右點),貢獻爲max(0,mxidisi+1)max(0,mx_i-dis_i+1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章