記錄一些日常思緒見聞,保持腦子清晰。。。
歡迎評論見解。。。
2021.09.13
- U群看到的:有一個最密排堆積的球陣(每個球周圍有12個球緊密結合的那種),球陣中有兩種球,紅色藍色,全部隨機分布,從球陣中挑選出顏色相同且至少能堆積為一個正四面體的子球陣。
直接暴力。將同規模的緊密結構進行暴力或隨機重排。
或者直接取出同色球匹配子球陣。
不會寫也不會分析,征求原題。。。
- 還是U群:估算一個區間內所有數字的最小質因數的和的復雜度
群友:
oeis A088821
a(n) ~ n^2/(2 log n)
2021.11.26
果真是非常頹廢,好久沒更新了。
昨天是感恩節,趁着假期更新一下,就暫時決定 vp 一下 csp 和 NOIp 吧。
CSP-S 2021
[CSP-S 2021] 廊橋分配
CSP 的 t1,一道性質良好的簽到題。
首先該題不保證單峰,所以無需考慮三分等奇怪做法。
因為廊橋之間沒有限制,所以每次到達一架飛機我們將其安排到編號最小的廊橋。
我們考慮對某個區域加入一個廊橋的影響和性質。
如果我們加入一個廊橋,必然有一架飛機會停在這個廊橋邊。根據題目性質,這架飛機的停留區間必須是最靠近上一個已選區間的。
也就是該飛機的到達時間必須最靠近上一架停留飛機離開時的時間。
現在需要知道的是怎么實現安排廊橋的過程。
建立兩個堆,一個放空閑廊橋稱為 \(h_1\),一個放停在機場的飛機稱為 \(h_2\)。
首先對兩種航班按照起飛時間排序。
然后當一架飛機落地時,我們先將起飛時間小於當前降落飛機的飛機移出 \(h_2\),然后再把他們對應的廊橋放回 \(h_1\)。 然后我們分配一個編號最小的廊橋給當前降落飛機,移出 \(h_1\),再把飛機放入 \(h_2\),最后該廊橋的貢獻 \(+1\)。
我們分別對國內航班和國際航班進行以上過程。復雜度是 $ \Theta (n\log n)$。因為廊橋和飛機只會進出堆一次。
我們發現我們記錄下的是每一個廊橋的貢獻,那我們該怎么求總貢獻的最優解。
我們已知,如果一個廊橋不空閑且是當前區域編號最大的,那么之前必然沒有空閑廊橋因為我們每次分配的是編號最小的。
那么對於每個區域,我們發現其前綴和,就是給其安排廊橋數量的貢獻。
聽起來很抽象,我們將其顯式地表達出來。我們設 \(f(x)\) 為到第 \(x\) 個航橋加入國內區域的貢獻,設第 \(i\) 個廊橋在國內區域的貢獻是 \(s_i\) 那么其本質是 \(\displaystyle \sum_{i=0}^{x}s_i\)。而設 \(g(x)\) 為從第 \(x+1\) 個廊橋開始到最后一個廊橋加入國際區域的貢獻。
那么最后我們只需要判斷給兩個區域分配多少廊橋達到最大值,則我們的答案是:
[CSP-S 2021] 括號序列
\(n\leq 500\),一眼區間 dp。
設 \(f_{i,j}\) 為將 \([i,j]\) 區間的問號填滿后可能的序列方案數。
對於區間有多種情況:
-
()
-
(A)
-
(S)
-
(SA)
-
(AS)
-
AB
-
ASB
我們可以 \(O(n)\) 預處理 S
串方便 \(O(1)\) 判斷某個區間是否為 S
串。
對於區間 \([i,j]\) 我們分類轉移:
- \([i+1,j-1]\) 是裸的
S
串直接轉移。 - \([i+1,j-1]\) 是否可以為
AS
或SA
串。 - \([i+1,j-1]\) 為
ASB
串
對於第三種情況較難處理。
我們可以枚舉斷點 \(l,r\) 那么轉移是 \(f_{i,l}\times f_{r,j}\) 且 \(s_{l+1,r-1}\) 是 S
串。
但是我們發現有些情況下兩個斷點會被重復計算,所以我們只需要強制只在第一個斷點計算。所以給狀態加一維表示能否進行后一次轉移,所以只需要保證 \(f_{i,l}\times f_{r,j}\) 的第三維 \([0/1]\) 不同即可。
由於第三種要枚舉 \(2\) 個斷點是 \(O(n^4)\) 的,於是我們進行前綴和或者后綴和優化即可 \(O(n^3)\)。
[CSP-S 2021] 回文
據說是簽到題,不過我覺得前三題難度都差不多。
由於得到的是回文串,那么我們在 \(a\) 中取出一個字符時放到 \(b\) 的末尾時,另一個仍存在於 \(a\) 中的字符取出的時間和在 \(b\) 中的位置是確定的。
同樣,我們不難發現對於回文 \(b\) 串,\(b_{[1,n]}\) 和 \(b_{[n+1,2n]}\) 一定都是一個 \(1\) ~ \(n\) 的排列。
我們假設第一個取出 \(a_1\)
現在我們找到一個 \(a_k,(k\in[2,2n])\) 且 \(a_k=a_1\)。
現在我們將 \(k\) 作為分割點,那么我們接下來必須要在 \(a_{[2,k-1]},a_{[k+1,2n]}\) 中取字符。
而且這兩個序列我們分別只能從左或者右取字符。
於是我們可以將它們考慮成 2 個棧。
我們設這兩個棧為 \(s_1,s_2\)。
L
表示從 \(s_1\) 彈出一個元素放入 \(b\) 尾,R
是從 \(s_2\) 中彈出。
現在要求一個字典序最小的操作序列使得 \(b\) 為回文串。
還是利用之前那個結論,我們發現彈出一個元素時另一個存在於棧內的同元素應該在另一個對稱的時間點也被彈出。所以此時另一個元素應該位於該棧棧底或另一邊的棧底。因為保證彈出后另一邊棧或當前棧的棧底相同的那個元素在對應位置彈出之前可以彈出其他的所有元素並保證數量對稱。
所以很簡單了,我們只需要每次彈出同時存在於兩個棧之一的棧頂,和兩個棧之一的棧底的元素,並同時刪除這兩個位置。如果存在 2 個這樣的字符,優先選擇 \(s_1\) 內的,因為需要保證字典序最小。
如果沒有這種情況,說明這個字符彈出后無論如何都沒辦法讓另一個達到匹配的位置,則是無解。
[CSP-S 2021] 交通規划
暫時不會,有待研究。。。
subtasks:
\(k\leq 2\) 網絡流染色。
小數據直接暴力。
這樣你就得到了優秀的暴力分。
沒有時間嚴格地 vp,得分大概是 \(100+40+48+40\)