【HALO軍械頻道】UNSC點防禦炮 —— 近距火力截殺
做題總結
2022.4.2
BS1215 旅館Hotel :
線段樹維護區間最大子段和,查詢時線段樹上二分。
BS1216 買水果 :push_up技巧。
inline void push_up(int id, int p) { t[id][p].mx = std :: max(t[id][p << 1].mx, t[id][p << 1 | 1].mx); t[id][p].mn = std :: min(t[id][p << 1].mn, t[id][p << 1 | 1].mn); t[id][p].ans = std :: max(std :: max(t[id][p << 1].ans, t[id][p << 1 | 1].ans), t[id][p << 1 | 1].mx - t[id][p << 1].mn); }
BS1221 環上最大子段和 :
分類討論最大子段和是一段區間或者是前後綴拼起來,後者可以用總和減去最小子段和。
注意選全部和一個不選的情況。
BS2728【SCOI2010】序列操作:
注意標記下傳的先後 :賦值 >乘法 = 翻轉 > 加法。
2022.4.3
BS2437【SHOI2008】堵塞的交通:
維護加邊,刪邊的連通性問題,如果不強制線上,可以直接線段樹分治,複雜度 \(O(n\log^2n)\)
但發現列只有二 ,考慮直接用線段樹維護矩陣四個端點的互相連通情況,是可以直接合並的。
把橫向連邊和縱向連邊分開考慮,最後注意查詢時可以繞路走,還需要分類討論,注意多畫圖。
BS3387 【SHOI2015】腦洞治療儀:
注意讀題,腦洞是極長的 0 連續段,而填補是用 1 去填補 0。
二分 + 線段樹。
BS6239 【SHOI2016】隨機序列:
注意分析性質,把極長的 \(\times\) 看做一個點,那麼把一個可能的表示式中的 \(+\) 與 \(-\) 互換再相加,就只剩下一個點,所以只有字首積能造成貢獻,係數為 \(2\times 3^{n-1-i}\),直接用線段樹維護即可。
2022.4.4
BS3981【SDOI2014】向量集:
好題。
因為 \(ans = \max(x_0x_i+y_0y_i)\),把 \(y_i\) 前的係數化為 \(1\) 得到 \(\dfrac{ans}{y_0} = \dfrac{x_0}{y_0}x_i+y_i\)
注意到是一個 \(kx+y\) 的形式,所以最優點一定在凸包上。
若 \(y_0 >0\),則要最大化右式 \(y_i =-\dfrac{x_0}{y_0}x_i+\dfrac{ans}{y_0}\),維護上凸殼。
若 \(y_0 <0\),則要最小化右式,維護下凸殼。
用線段樹維護區間凸殼,注意到是動態加點,查詢。要等到這個區間被填滿後再構建凸殼,可以直接用它的兒子的凸殼合併,查詢時二分斜率,取 \(\max\) 即可。
BS2461 Optimal Milking:
線段樹維護最大獨立集,直接設 \(f_{0/1,0/1}\) 表示左端點選 / 不選,右端點選 / 不選的最大獨立集。
BS6433 【ZJOI2019】語言
先算出有序點對 \((u,v), u \neq v\) 的數量,再除以 2 就是無序的了。
對於每一個點單獨考慮,發現它能到達的點一定是一個連通塊,而且是所有包含它的路徑的並。
包含它的路徑可以壓縮成兩個端點,所以一個連通塊可以描述成若干個點形成的虛樹的邊的總和(因為 E = V - 1)。
所以現在的問題就是每個點有一個集合,每次把一條路徑上的點的集合加入一個點,最後查詢每個點集合形成的虛樹大小。
可以直接差分,利用線段樹合併維護,形成的虛樹大小為所有點按 dfn 序排序後相鄰的點距離之和+第一個點與最後一個點的距離 / 2。
BS5625 【PKUWC2018】Minimax
首先寫出樸素dp : 設 \(f_{x,i}\) 表示 \(x\) 點的權值為 \(i\) 的概率, 沒有兒子和只有一個兒子的轉移是平凡的。只考慮兩個兒子 \(y_1,y_2\) 的情況 :
\(f_{x,i} = (\sum\limits_{j=1}^{i-1}f_{y1,j} \times f_{y2,i}+\sum\limits_{j=1}^{i-1}f_{y2,i} \times f_{y1,i}) \times p_x + (\sum\limits_{j=i+1}^{m}f_{y1,j}\times f_{y2,i}+\sum\limits_{j=i+1}^{m}f_{y2,j}\times f_{y1,i})\times (1-p_x)\) 。
設 \(sum_x = \sum\limits_{i=1}^{m}f_{x,i}\) 後直接套用 P6773 [NOI2020] 命運 的線段樹合併方法 :維護 \(f_{y1,i}\) 的字首和 \(s_1\) ,\(f_{y2,i}\) 的字首和 \(s_2\),類似 cdq 的思想,先合併左邊,累加 \(s_1,s_2\),再合併右邊,若沒有左右兒子直接打上乘法標記。