1. 程式人生 > 其它 >halcon-select_shape_std選擇給定形狀的區域

halcon-select_shape_std選擇給定形狀的區域

ARC 114

3.13開的一場vp。
拉的不行,只做出了前 2 道。

A.Not coprime
  • 題意: 找最小的一個數和陣列 \(X\) 中的每個數都不互質。
    做法:由於 \(X_i\) 很小,只有 \(15\) 個質因數,直接列舉所有情況即可, 時間複雜度 \(O(n2^{15})\)

賽時wa了兩發。

第一發以為直接列舉即可,但是發現了15個質因數的和可能很大。

第二發最小值初始值設小了。

B. Special Subsets
  • 題意: 給出陣列 \(f(n\leq 2 \times 10^5,1\leq f_i \leq n)\) , 選出一些數,滿足以下條件:
    1. 如果 \(i\)
    被選,那麼 \(f_i\) 就得被選。
    2. 如果 \(a \neq b\), 且 \(a, b\) 被選,那麼 \(f_a \neq f_b\)
    求方案數。
  • 做法:第一個條件實際上就是一個依賴關係,會選出一個環可能帶一條鏈,第二個條件表明一個每個點的入度為 1,這樣的東西只能是環了。
    做法就很顯然了,拓撲排序找出所有的環,記個數為 \(c\), 答案即是 \(2^c - 1\)

賽時wa了一發,原因是陣列沒開大。

C.Sequence Scores
  • 題意: 只給出序列長度 \(n (\leq 5000)\), 每個數的範圍 \(1\sim m(\leq 5000)\)
    初始有全零的序列,每次操作可以任選一段區間 chkmax 一個任選的數,
    \(f(S)\)
    表示,變成這個序列 \(S\) 的最小操作次數,求 \(m^n\) 種序列的 \(f(S)\) 的和。
  • 做法: 考慮新加入一個數 \(S_i\) 造成的 \(f(S)\) 的變化。
    1. 如果前面有數 \(S_j = S_i\), 並且 \(j + 1 \sim i - 1\) 這段的 \(S\)\(\geq S_i\), 那麼可以在 \(j\) 操作的時候順帶把這位chkmax,這樣就沒有變化了, 否則變化 1。
    2. 如果沒有出現過,那麼就會變化 1.
    現在只需要考慮如何計算總變化,求補集即可。那麼列舉當前的數 \(x\),在列舉相同出現的位置:
    $$\Delta_{x} = m^{i - 1} - \sum_{j = 0}^{i - 1}(m - x)^{i - j - 1} m^{j - 2}$$
    求答案時,
    $$\text{ans}_i = \sum _{x=1}^m \text{ans} _{i - 1} + \Delta _{x}$$
    賽時一直想怎麼dp,就做不出來了。
D. Moving Pieces on Line
  • 題意: 給出一些點 \(a (|a_i| \leq 10^9, n\leq 5000, n \equiv 0 \pmod 2)\), 和一些區間 \(b\)
    初始時,數軸上的邊都是紅色,你可以對點 \(a\) 左右移,邊被經過一次,代價為 1, 就會將顏色翻轉,紅變藍或藍變紅。
    求最小代價,使得每個區間都是藍色。
  • 做法:觀察到,點\(a\) 只往一個方向移動,回頭肯定不優。
    區間問題不好做,考慮差分變成單點問題, 這就發現顏色翻轉和異或有關,這樣就會變成異或差分。
    問題轉化為,剛開始對 \(n\) 個點和區間兩端異或 \(1\), 有 \(n\) 個剩餘的 \(1\) 可以隨意異或,代價是和起點的距離,要求最後是全0。
    考慮無解的情況, 當 \(n\) 個點比初始 \(1\) 的個數少時,那就一定不能使得最後全為 0。
    剩下就是匹配問題,當點數相同時,顯然貪心距離最小的優先匹配。
    但是 \(n\) 個點比初始 \(1\) 的個數多時,\(n\) 個點內部還要自己匹配,相鄰兩點匹配也是最優的。
    於是設 \(f_{i, j}\) 表示可以用 \(i\) 個 1匹配,剩下 \(j\) 個要消去。
    轉移可以 從 \(f_{i - 1, j - 1}\)\(f_{i - 2, j}\) 來。
E. Paper Cutting 2
  • 題意:給出一個 \(W \times H (W, K \leq 10^5)\) 的矩陣,有 \(H - 1\) 條可以切開的豎線 和 \(W - 1\) 條可以切開的橫線,
    如果切到給定的一個子矩陣 \((w1, h1), (w2, h2)\)就停止,否則將選擇有給定子矩陣的那一塊,求期望切的次數。
  • 做法:由於期望有線性性,考慮拆開每條線的對總期望的貢獻。
    由於四個方向的線相互獨立,可以拆開。
    以子矩陣右邊的豎線為例,它能貢獻一次的情況是
    1. 子矩陣沒被切到,有 \(k = w2 - w1 + h2 - h1\) 條。
    2. 豎線到子矩陣的豎線條數,有 \(c\) 條。
    能貢獻一次的概率當且僅當 在 \(k + c\) 條線中第一次被切到,於是期望次數就是 \(\frac{1}{k + c}\)
    對每一條線的期望求和就是答案 。
F. Permutation Division
  • 題意:給出 \(n(\leq 2 \times 10^5)\) 個數的排列 \(P\), 要把排列分成 \(k\) 個連續段,要使這 \(k\) 個段重排後的 \(Q\) 的最大字典序最小,並求出這個字典序 \(Q\)
  • 做法:注意到,\(Q\) 的字典序總是大於等於 \(P\)
    又注意到,開頭的 \(P_1\) 一定是某一段的開頭。
    顯然使得段重排的字典序最大,就要按段開頭的數字的字典序排序。
    就考慮 \(P_1\)\(k\) 的關係。
    1. 如果 \(P_1 \leq k\), 那麼每段開頭一定是 \(1 \sim k\), 重排就是最小的字典序了。
    2. 如果 \(P_1 \geq k\), 這時是挑 \(1 \sim k - 1\)為開頭嗎?不一定是最小。
    求字典序最小,就來點強的約束條件,求出 \(Q\)\(P\) 的最長公共字首。
    用二分就可以判定了, 記長度為 \(l\)
    為了使前字首的不變,那麼就一定要選出一個包含 \(P_1\)\(1\sim l\) 的下降子序列,子序列長度就是拆分的段數。
    又要剩下的數分成段不排到前面,就要滿足拆分的段的開頭 \(< P_l\),為了存在合法的情況,就要使得子序列的長度儘可能長,就越容易找出合法的序列。
    \(1\sim l\)的最長下降子序列的長度是 \(a\), 那麼只要選剩下 \(1\sim k - a\) 小的開頭重排就是最小的 \(Q\)