1. 程式人生 > 其它 >計算機網路常用知識

計算機網路常用知識

做題總結

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\),再合併右邊,若沒有左右兒子直接打上乘法標記。