8.5 模擬賽

QcpyWcpyQ發表於2024-08-05

總結

輸在語文上了。

t1 簽到題。

t2 神秘 dp,問題主要在處理二次函式的限制上,考慮直接拆開或者差分後面的思路就容易了。

t3 語文題,要將集合的關係轉移到圖上,部分分給了非常多的正解啟示。

t4 dp,卡特蘭數,格路計數。


題解

road

二分答案,轉化為最少新增幾個傳送錨點,對於每兩個點對計算需要新增多少個傳送錨點,然後跑最短路即可。

時間複雜度為 \(\mathcal O(m^2\log n)\)

seq

對於 \(50\) 的部分分,令 \(dp_{i,j}\) 為前 \(i\) 個數,結尾為 \(j\) 的最小花費,暴力轉移即可。時間複雜度為 \(\mathcal O(nA^2)\)

對於 \(70\) 的部分分,考慮如何不用列舉前一個數的大小。因為 \(c\) 是固定的,所以 \(dp_{i-1,j}\rightarrow dp_{i,k}\) 的花費為 \(c\times|j-k|\)​。

於是記錄 \(sum_{i,j}\) 表示 \(\min(dp_{i,k}+c\times(k-j))\),正著反著掃一遍預處理,就可以做到 \(\mathcal O(1)\) 轉移。

需要滾動陣列避免空間爆炸,時間複雜度為 \(\mathcal o(nA)\)

對於全分,發現對於左右兩邊都比自己大的數,肯定會不停往上增加,直到 \(x^2>2c\)

但在那之前,如果它與左右兩邊某一個數一樣大了,那麼兩個數一定會一起向上增加或是一起停止,否則無貢獻甚至負貢獻。

\(x^2\) 的限制非常煩人,考慮拆開。因為 \((x+1)^2-x^2=2x+1\),所以只用維護 \(\sum x\)

找到 \([l,r]\) 的最大值 \(a[mid]\) ,然後拆成左右兩個區間,遞迴去做。如果左右兩個區間都能升到和 \(a[mid]\) 一樣的大小,那麼就把這個區間看成一個整體繼續向上加,否則繼續向上加是沒有意義的。二分計算即可。

時間複雜度為 \(\mathcal O(n\log n)\)

set

對於 \(c_i=1\) 的部分,如果把每個集合的下標與需要交起來的的集合下標連邊,發現最後會形成森林。

建立一個根節點把他們拼成一棵樹。那麼集合 \(B_i\) 就是節點 \(i\) 到根節點路上所有的陣列成的集合。

所以每次詢問只找到這些關鍵點所在的最小聯通塊,統計出所有點到根節點路徑的並即可。

這個只需要將關鍵點按照 dfn 排序後求所有點的深度和減去相鄰兩個點的 LCA 深度和。

對於 \(k\leq 2\) 的部分,還是把每個集合的下標與需要交起來的的集合下標連邊。

如果 \(x\in B\),那麼從節點 \(i\) 出發,走到終點的所有路徑都要經過點 \(x\)。根據這點我們建立支配樹就好了。

結合上面兩個部分分,正解其實就是在建好的支配樹上用 \(c_i=1\) 的部分分做法計算就好了。

時間複雜度為 \(\mathcal O(n\log n)\)

sort

考慮 dp 出合法的方案數。

從大到小插入元素,一個元素插入後作為不合法的末端,當且僅當前面兩個比它大的元素中間夾了一個比它小的。

那麼也就是插入到一個地方就保證這個位置前面已經插入的所有元素中間不能再插入元素了。

\(f_{i,j}\) 表示插了 \(i\) 個數,有 \(j\) 塊(塊之間可以插元素)的方案數。

轉移列舉插在哪個空隙,發現插在最開頭和前兩個塊中間會使塊數加一,其它的會使 \(j\) 塊變成 \(2\leq k\leq j\) 塊。

轉移就是 \(2f_{i,j}\to f_{i+1,j+1}\)\(f_{i,j}\to f_{i,k}(2\leq k\leq j)\)。直接寫是 \(\mathcal O(n^3)\) 的。

最佳化成 \(\mathcal O(n^2)\),有 \(f_{i,j} = f_{i,j+1} + 2f_{i-1,j-1} + f_{i-1,j}\)

轉化成格路計數,即為:

\[\left| L\left((0,0)\to(n,n)\mid x\geq y\right)\right|,(x,y)\to (x+1,y),(x,y+1),(x+1,y+1) \]

可分治 FFT / oeis 法做。時間複雜度為 \(\mathcal O(n\log n)\)\(O(n)\) 不等。