1. 程式人生 > 其它 >「2022/03」學習記錄

「2022/03」學習記錄

主要是為了本地備份。另外這個月鴿了好多篇總結(?大問題)。很摸的一個月。

「聯合省選 2020 A | B」冰火戰士

有冰和火兩種戰士。每個戰士有一個溫度 \(x_i\) 和一個能量 \(y_i\)

假設場地的溫度是 \(k\),冰戰士能上場當且僅當 \(x_i \le k\),火戰士能上場當且僅當 \(x_i \ge k\)

接下來,你需要指定一個 \(k\),能上場的戰士中,冰戰士的能量和與火戰士的能量和的兩倍最小。

會給定 \(q\) 次詢問,每次加入一個新戰士或者刪除一個之前加入的戰士。

其中 \(1 \le q \le 2 \times 10^6,1 \le x \le 2 \times 10^9,\sum y_i \le 2 \times 10^9\)

不妨設 \(f(k)\) 表示溫度為 \(k\) 時冰戰士的能量和,\(g(k)\) 表示火戰士的能量和。

顯然 \(f(k)\) 是單調不降的,\(g(k)\) 是單調不升的。如果畫出圖就可以發現在 \(f\)\(g\) 交點前是 \(f\) 的影象,交點後是 \(g\) 的影象。

那我們求出交點就可以了。但答案是整點,所以選擇最靠近答案的整點,即 \(g-f \ge 0\) 最大的 \(k\)\(f-g \ge 0\) 最小的 \(k\)

考慮二分答案,再用樹狀陣列維護前後綴和即可。

但其實也可以不用二分,考慮用倍增。倍增的值直接樹狀陣列。複雜度 \(\mathcal{O}(n \log n)\)

「聯合省選 2020 A」作業題

給定一個無重邊無自環的 \(n\) 個點 \(m\) 條邊的圖,定義一個生成樹 \(T\) 的價值為:

\[val(T)=\left( \sum\limits_{i=1}^{n-1}w_{e_i} \right) \times \gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}}) \]

其中 \(e_1,e_2,\dots,e_{n-1}\) 表示 \(T\) 包含邊的編號。

求出所有 \(T\) 的價值之和並對 \(998244353\) 取膜。

其中 \(2 \le n \le 30,1 \le m \le \frac{n(n-1)}{2},1 \le w_i \le 152501\)

\(t=\gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}})\) 。由尤拉反演 \(x=\sum\limits_{d|x} \varphi(d)\)

\[val(T) = \sum\limits_{i=1}^{n-1} w_{e_i} \times \sum\limits_{d|t} \varphi(d) \]

於是考慮計算答案時列舉 \(d\),然後保留 \(d|w_i\) 的邊。

\[ans= \sum\limits_{d} \varphi(d) \sum_{T}\left( \sum\limits_{i=1}^{n-1}w_{e_i} \right) \]

接著考慮,只保留滿足條件的邊的圖,的生成樹的價值和。

注意矩陣樹定理是計算樹的權值積而不是和。那我們對一條邊的貢獻變形,變成 \((1+w_ix)\)

這樣做乘法時,就是 \((a+bx) \cdot (c+dx)=(ac+(ad+bc)x)\),那麼答案就是一次項係數。

寫的時候還要寫個加減乘除自定義運算啥的就行了。然後直接矩陣樹定理。

「聯合省選 2021」寶石

給定一個 \(n\) 個點的樹,\(m\) 種寶石。第 \(i\) 個點售賣第 \(w_i\) 種寶石。收集器可以收集 \(m\) 個寶石,且必須按照 \(p_1,p_2,\dots,p_c\) 順序收集,其中保證 \(p\) 互不相同。

\(q\) 次詢問,每次詢問一條路徑 \(s \rightarrow t\),問最多可以收集到多少個寶石。

其中 \(n,q \le 2 \times 10^5, 1 \le c,m, \le 5 \times 10^4\)

首先通過一些處理把 \(p\) 變成一個連續的排列。

我們把一條路徑 \(s \rightarrow t\) 拆成兩段,設 \(x=\operatorname{lca}(s,t)\) 。於是有 \(s \rightarrow x\)\(x \rightarrow t\)

對於前一段,我們可以預處理出每個點到最近的 \(p_1\) 的位置。對於一個點 \(u\),如果從他開始跳,那麼必須跳到點 \(v\) 滿足 \(p_v = p_u+1\)。這部分可以用倍增處理。

但對於後一段,發現往下跳非常麻煩,於是考慮對這個路徑倒著做 \(t \rightarrow x\),但這樣就不知道起點是什麼。考慮二分起點,然後 \(u\) 點就需要跳到點 \(v\) 滿足 \(p_v=p_u-1\)。這也可以倍增處理。

於是剩下最後一個問題,如何找到 \(t\) 祖先第一個寶石是 \(mid\) 的點。

可以把詢問全部離線,然後一起遍歷的時候開一個桶,記錄當前點的祖先的寶石的最近位置即可。

複雜度 \(\mathcal{O}(n \log^2n)\)

「聯合省選 2021 A | B」滾榜

給定 \(n,m\)\(n\) 個數 \(a_i\)。問有多少種排列,滿足 \(a_i+b_i\) 後是所有數的最大值,滿足 \(b_i\) 不降且 \(\sum b_i =m\)

其中 \(1 \le n \le 13,1 \le m \le 500,0 \le a_i \le 10^4\)

首先注意到題目問的是多少種排列而不是 \(b_i\) 的分配。所以我們不妨對一個排列的 \(b_i\) 進行最優分配。

如果當前的 \(a_i > a_{i-1}\) ,那麼設 \(b_i=b_{i-1}\);否則設 \(b_i=b_{i-1}+a_{i-1}-a_i\)。最後判斷總和是否小於等於 \(m\) 即可。

我們把上面的式子變個形,\(\sum b_i=\sum \max(a_{i-1}-a_{i},0)(n-i+1)\)

考慮狀壓,設 \(f(s,i,k)\) 表示選了 \(s\) 狀態的數,第 \(|s|\) 位是 \(i\),貢獻了 \(k\) 的方案數。於是有

\[f(s,i,k) \leftarrow f(s,i,k)+f(t,j,k-g(j,i)\times(n-|s|)) \]

其中 \(t\) 表示相對 \(s\) 還沒選的一位,\(g\) 表示貢獻。

「聯合省選 2021」矩陣遊戲

有一個 \(n \times m\) 的矩陣 \(a_{i,j} (1 \le i \le n, 1\le j \le m)\),其每個元素為大小不超過 \(10^6\) 的非負整數。

根據該矩陣生成了一個 \((n-1) \times (m-1)\) 的矩陣 \(b_{i,j} (1 \le i \le n-1, 1 \le j \le m-1)\),每個元素的生成公式為

\[b_{i,j}=a_{i,j}+a_{i+1,j}+a_{i,j+1}+a_{i+1,j+1} \]

根據給出的矩陣 \(b_{i,j}\),還原出 \(a_{i,j}\)

考慮沒有限制怎麼做。想怎麼怎麼寫(,於是會出現若干個數不滿足 \(0 \le a_{i,j} \le 10^6\)

然後我們又發現,我們對行進行 \(+1\)\(-1\),結果是不變的。列也一樣。

於是設行變了 \(c_i\),列變了 \(d_j\),於是有 \(0 \le a_{i,j} \pm c_i \pm d_j \le 10^6\)。對於同時 \(x-y\) 的形式可以用差分約束,而 \(x+y\) 不大行。

考慮對於偶數的 \(i\) 和奇數的 \(j\)\(c_i,d_j\) 取反。於是都是 \(x-y\) 形式了。差分約束即可。

「聯合省選 2021 A | B」圖函式

給定一個 \(n\) 個點 \(m\) 條邊的的有向圖 \(G\),定義 \(f(u,G)\) 表示有多少個 \(v\) 滿足只走大於等於 \(v\) 的點有 \(u \rightarrow v\)\(v \rightarrow u\)

定義 \(h(G)=\sum\limits_{i=1}^n f(i,G)\)。定義 \(G_i\) 表示刪掉第 \(1\)\(i\) 的邊。

\(h(G)\) ,和對於所有 \(1 \le i \le m\)\(h(G_i)\)

其中 \(n \le 10^3,m \le 2 \times 10^5\)

注意到一個點對會對一個答案的字首產生貢獻,不妨設 \(u \rightarrow v,v \rightarrow u\) 經過的邊編號最小值最大化為 \(x\)。也就是說他貢獻了一個字首,也就是一個差分陣列,最後求答案可以取字首和。

而這個差分陣列可以用 Floyd 求出。

複雜度 \(\mathcal{O}(n^3+m)\)。可以通過本題(?

「聯合省選 2021 A」支配

給定一張 \(n\) 個點 \(m\) 條邊的有向圖 \(G\),其頂點從 \(1\)\(n\) 編號。

對於任意兩個點 \(u,v\),若從頂點 \(1\) 出發到達頂點 \(v\) 的所有路徑都需要經過頂點 \(u\),則稱頂點 \(u\) 支配頂點 \(v\)。特別地,每個頂點支配其自身。

對於任意一個點 \(v\),我們將圖中支配頂點 \(v\) 的頂點集合稱為 \(v\) 的受支配集 \(D_v\)

現在有 \(q\) 次互相獨立的詢問,每次詢問給出一條有向邊,請你回答在圖 \(G\) 中加入該條邊後,有多少個頂點的受支配集發生了變化。

其中 \(1 \le n \le 3 \times 10^3,1 \le q \le 2 \times 10^4\)

首先可以發現,支配具有傳遞性,如果 \(x\) 支配 \(y\)\(y\) 支配 \(z\) ,那麼 \(y\) 支配 \(z\)。而如果 \(x,y\) 都支配 \(a\),如果 \(x,y\) 之間沒有支配關係則意味著,如果刪除 \(x\),則可以通過 \(y\) 走到 \(a\),那不滿足定義。所以 \(x,y\) 之間會有支配關係.

對於一個點 \(x\),有且僅有存在一個點 \(y \in D_x\),滿足 \(D_x\) 中其他的點都支配 \(y\)。所以我們把圖建出一棵樹,邊為 \((x,fa_x=y)\) ,這就是支配樹。這也意味著 \(D_x=D_y+1\)

加入一條邊後,所有點的 \(D_x\) 只會變小或不變。由上面那些東西得,對於一個點 \(x\),要麼他的 \(fa_x\) 不支配 \(x\),要麼 \(fa_x\) 的支配集也會變。

所以只考慮加邊 \((p,q)\)\(fa_x\) 不支配 \(x\),這意味著刪除 \(fa_x\)\(1 \rightarrow p \rightarrow q \rightarrow x\)

注意這題資料範圍不大,直接列舉然後暴力出每個點的支配集,建出支配樹。然後列舉每個點刪除其父親後,哪些點仍然可以從 \(1\) 到達,哪些點可到達 \(x\) ,預處理出來。詢問的時候直接判當前點和對其父親的影響即可。

「八省聯考 2018」劈配

考慮每次加入一個人會發生什麼變化。如果當前最小的志願裡存在一名導師的學員沒滿,就選。如果滿了,就看看目前在隊伍裡的人有沒有可以換導師且換完每個人的志願沒有變。

發現這個類似二分圖匹配的過程。

類似 STEAD - Steady Cow Assignment,對一個老師設一個 \(cnt\) 表示上限。

對於當前學員 \(x\),從小到大列舉他的支援 \(y\),如果當前存在一個老師 \(u\) 可以匹配就匹配,不能匹配就列舉他的學員看有無人可以替換。

對於第二問,顯然答案可以二分。二分一個位置,先把這個位置前的匹配加入後,列舉能否匹配 \(b_x\) 前的志願。

複雜度爆炸,我們發現前面的匹配是不會變的,考慮預處理出字首 \(i\),表示前 \(i\) 個加入匹配時匹配的情況。

「六省聯考 2017」摧毀“樹狀圖”

如果我有罪請用法律制裁我而不是讓我做這種小清新()樹上 DP 。

這題你說他好吧但他實在是太喪心病狂了。

考慮設 \(f(u,0/1/2/3)\)

其中 \(f(u,0)\) 表示選擇切一條,端點在 \(u\),另一端點在子樹內的鏈的答案。

其中 \(f(u,1)\) 表示選擇切一條,兩個端點都在子樹 \(u\) 內,且不經過 \(u\) 的答案。

其中 \(f(u,2)\) 表示選擇切一條,兩個端點都在子樹 \(u\) 內,且經過 \(u\) 的答案。

其中 \(f(u,3)\) 表示選擇切兩條,一條端點在 \(u\),另一個端點在子樹內;另一條兩端點都在子樹內。可以有點相交的答案。

分類討論轉移和計算答案。(不想寫了。

「六省聯考 2017」組合數問題

給定 \(n,p,k,r\),求

\[\left( \sum\limits_{i \ge 0} \dbinom{nk}{ik+r} \right) \bmod p \]

其中 \(1 \le n \le 10^9, 0 \le r < k \le 50,2 \le p \le 2^{30}-1\)

考慮這個式子的意義,給定 \(nk\) 個物品,從中選出 \(x\) 滿足 \(x \equiv r \pmod k\) 的方案數。

\(f(i,j)\) 表示到第 \(i\) 個物品,選了 \(x \equiv j \pmod k\) 的方案數。

\[f(i,j)= \begin{cases} f(i-1,j)+f(i-1,j-1) & j \neq 0 \\f(i-1,k-1)+f(i-1,j) &j=0 \end{cases} \]

滾掉第一維。記下來考慮用矩陣乘法優化。

最後注意 \(k=1\) 的情況。

「CEOI2004」Sweets

John 得到了 \(n\) 罐糖果。不同的糖果罐,糖果的種類不同(即同一個糖果罐裡的糖果種類是相同的,不同的糖果罐裡的糖果的種類是不同的)。第 \(i\) 個糖果罐裡有 \(m_i\) 個糖果。

John 決定吃掉一些糖果,他想吃掉至少 \(a\) 個糖果,但不超過 \(b\) 個。問題是 John 無法確定吃多少個糖果和每種糖果各吃幾個。有多少種方法可以做這件事呢?

其中 \(1 \le n \le 10, 0 \le a,b \le 10^7, 0 \le m_i \le 10^6\)

生成函式的入門題。很適合我這種完全不會 GF 人(?)。說,謝謝 CEOI (。

首先,可以算限制為不超過 \(p\) 的方案數 。這樣答案就是 \(b\) 的方案數減去 \(a-1\) 的方案數。

令係數表示拿的糖數,係數表示方案數。於是對於一個糖 \(i\),有:

\[f_i(x) = \sum\limits_{j=0}^{m_i}x^j = \dfrac{1-x^{m_i+1}}{1-x} \]

於是答案就是把每個糖捲起來,有:

\[f(x)=\dfrac{\prod\limits_{i=1}^n(1-x^{m_i+1})}{(1-x)^n} \]

因為 \(n\) 很小,所以上面的那個可以暴力拆式子。對於下面那個,用廣義二項式定理拆開。

\[\begin{aligned} (1-x)^{-n} &= \sum\limits_{i \ge 0} \dbinom{-n}{i} \cdot (-x)^i \\ &= \sum\limits_{i \ge 0} \dfrac{(-n)(-n-1)\dots(-n-i-1)}{i!} (-x)^i \\ &= \sum\limits_{i \ge 0} \dbinom{n+i-1}{i} x^i \end{aligned} \]

於是答案為:

\[f(x)= \left( \prod\limits_{i=1}^n (1-x^{m_i+1}) \right) \sum\limits_{i \ge 0} \dbinom{n+i-1}{i}x^i \]

注意我們限制只到 \(p\),所以我們考慮對於拆後的每一項的對答案 \(ax^b\) 的貢獻。

\[a \cdot \sum\limits^{p-b} \dbinom{n+i-1}{i} = a \cdot \dbinom{n+p-b}{p-b} \]

但本題的模數不是質數,計算組合數的時候需要用到擴充套件盧卡斯。但也可以用一個小技巧。

可以先把模數乘上除數,再將運算結果除以除數得到答案。

「CEOI2017」Mousetrap

有一個有 \(n\) 個房間和 \(n-1\) 條走廊的迷宮,保證任意兩個房間可以通過走廊互相到達,換句話說,這個迷宮的結構是一棵樹。

一個老鼠被放進了迷宮,迷宮的管理者決定和老鼠做個遊戲。

一開始,有一個房間被放置了陷阱,老鼠出現在另一個房間。老鼠可以通過走廊到達別的房間,但是會弄髒它經過的走廊。老鼠不願意通過髒的走廊。

每個時刻,管理者可以進行一次操作:堵住一條走廊使得老鼠不能通過,或者擦乾淨一條走廊使得老鼠可以通過。然後老鼠會通過一條幹淨的並且沒被堵住的走廊到達另一個房間。只有在沒有這樣的走廊的情況下,老鼠才不會動。一開始所有走廊都是乾淨的。管理者不能疏通已經被堵住的走廊。

現在管理者希望通過儘量少的操作將老鼠趕到有陷阱的房間,而老鼠則希望管理者的運算元儘量多。請計算雙方都採取最優策略的情況下管理者需要的運算元量。

注意:管理者可以選擇在一些時刻不操作。

其中 \(1 \le n \le 10^6\)

不妨以陷阱的地方為根,這樣變成了把老鼠趕到根節點。

假設管理者不做任何操作,那麼最後老鼠一定會因為不走骯髒的地方而困死在一個葉子節點。那接下來考慮在老鼠被困的時候把其他子樹都堵住,讓擦完地板後老鼠只能沿著一條路一路向根節點。

這是最優的,如果我們不堵住,那麼老鼠肯定會轉身去另外一個子樹,又被困住,除了要把這條路擦乾淨還要處理新子樹內的其他情況。

於是老鼠能做的策略只有,向上走一些點,然後選一個子樹走進去,最後被困葉節點。

先考慮預處理出選擇某子樹進入後需要的運算元。不妨設 \(f(i)\) 表示進入 \(i\) 子樹後,再被趕回 \(i\) 的最小運算元。

假設目前計算到 \(u\) ,那麼對於老鼠來說,肯定會選擇 \(f(v)\) 最大的兒子節點 \(v\)。所以管理者在最優情況下選擇堵住 \(f(v)\) 最大的那個點,那麼老鼠只能選擇 \(f(v)\) 次大的那個點。設 \(d(u)\) 表示一個點的度數,於是有

\[f(u) = f(v) +d(u)-1 \]

\(1\) 是因為父節點,而 \(v\) 滿足 \(f(v)\) 次大。剩下的邊要麼是堵住的要麼是回來的時候要擦乾淨的。

為了讓老鼠儘量按照我們的預期走,我們希望老鼠到根的路徑的支路封掉。所以也預處理出 \(cnt(u)\) 表示 \(u\) 往下走一步後需要封掉的上面路徑的其他支路。於是有 \(cnt(u)=cnt(fa_u)+d(u)-2\)。減去到父親的邊和到子樹的邊。

所以 \(u \rightarrow v\) 的運算元是 \(f(v)+cnt(u)+1\),回頭的時候要把 \(u \rightarrow v\) 擦乾淨。注意如果 \(u\) 是根節點需要 \(-1\)

接下來發現最小的答案仍然不好計算,考慮二分答案。

注意到老鼠會往上跳然後選子樹,通過預處理的東西可以直接算出當前點的兒子的運算元。

但如果當前運算元大於我們二分的 \(x\),那麼就不能走必須堵住這路。

不妨設堵了 \(s\) 條路,如果 \(s>x\) ,或者 \(s\) 比向上跳的次數的 \(+1\) 還大,即意味著老鼠比人更快到這個子樹,就意味著這個答案不合法。

複雜度 \(\mathcal{O}(n \log n)\)

「PKUWC2018」隨機遊走

給定一棵 \(n\) 個結點的樹,你從點 \(x\) 出發,每次等概率隨機選擇一條與所在點相鄰的邊走過去。

\(q\) 次詢問,每次詢問給定一個集合 \(S\),求如果從 \(x\) 出發一直隨機遊走,直到點集 \(S\) 中所有點都至少經過一次的話,期望遊走幾步。

特別地,點 \(x\)(即起點)視為一開始就被經過了一次。

答案對 \(998244353\) 取模。

其中 \(1 \le n \le 18,1 \le q \le 5000\)

一連補多個知識盲區。好耶!

問題等價於求當這個點集每個點都走過時,對於每個點的期望求個 \(\max\)

根據 \(\min - \max\) 容斥,在期望下仍然成立。放個連結 Min-Max容斥小記 給自己指路。

\[\max(S) = \sum\limits_{T \subseteq S} (-1)^{|T|+1} \min(T) \]

所以。只要求第一次走到這個集合時的期望就是 \(\min\)

接下來考慮對一個集合 \(S\),如何計算答案。記 \(d_u\) 表示點 \(u\) 的度數,\(fa_u\) 表示父親,\(f(u)\) 表示從 \(u\) 出發的答案。

\[f(u)=\dfrac{1}{d_u} (f(fa_u)+\sum f_v ) + 1 \]

可以高消。但是列舉子集再高消似乎複雜度會寄。

考慮待定係數。希望他只從父親轉移來。這樣就不用高消了。我們希望他是 \(f(u)=k_u f(fa_u)+b_u\)。於是

\[\begin{aligned} f(u) &= \dfrac{1}{d_u} (f(fa_u)+\sum f_v ) + 1 \\ f(u) &= \dfrac{1}{d_u} (f(fa_u)+\sum (k_vf(u) +b_v ) ) + 1 \\ d_u \cdot f(u) &= f(fa_u) + (\sum k_v) \cdot f(u) + \sum b_v + d_u \\ (d_u - \sum k_v) \cdot f(u) &= f(fa_u) + \sum b_v + d_u \\ f(u) &= \dfrac{1}{d_u-\sum k_v} f(fa_u) + \dfrac{\sum b_v + d_u}{d_u - \sum k_v} \end{aligned} \]

於是 \(k_u = \dfrac{1}{d_u-\sum k_v} , b_u = \dfrac{\sum b_v + d_u}{d_u - \sum k_v}\)。答案就是根節點的 \(b\)

所以列舉一個子集。可以 \(\mathcal{O}(n)\) 的算出這個子集的 \(f\)

考慮詢問。如果列舉這個詢問的集合的子集複雜度又寄了。

注意到一個子集的子集 \(T\) 的計算和 \(S\) 沒有關係。所以考慮列舉 \(T\) 去貢獻 \(S\)。考慮高維字首和。指路 淺談高維字首和

「2020-02-28 省選模擬賽」小 B 的夏令營 (camp)

題目的連通。相當於存在一條被摧毀的路徑,從第 \(n+1\)\(1\) 行。

考慮如何存下這些路徑。為了不重複,每條路徑都優先向下,再向左或向右。

於是設 \(f(i,j)\) 表示從 \(i-1\) 到這 \((i,j)\) 時,有向右。\(g(i,j)\) 表示有向左。\(h(i,j)\) 表示啥都無。

「2020-03-04 省選模擬賽」很簡單 (c)

網路流。假設全部選 B ,於是建圖建出來選 R 的情況,然後費用改成 \(w_r-w_b\) 就好了。

對於給定的路徑 \(u \leftarrow v\),對於一條路徑的顏色,把 \(s \rightarrow u,v \rightarrow t\),上下界強制為 \(1\),其中 \(u \leftarrow v\) 費用為這條路徑的 \(r\) 費用減去 \(b\) 費用。

然後對於一條邊的限制。連邊 \(u \rightarrow fa_u\) ,上下界為 \(b\) 在這條邊最多和最少的顏色數量。

這意味著如果,每條路徑如果不選擇 \(r\),就要經過 \(u \rightarrow fa_u\) 邊,或者選擇 \(r\),直接 \(v \rightarrow u\)

「2022-03-14 省選模擬賽」

矩陣基問題 (basis)

鴿。

非對稱資訊博弈問題 (war)

為了研學報告然後把題出到模擬賽裡的 Linshey 是鑑。

首先肯定是能衝就衝。如果碰到了對手就和他幹架(幹架這裡我賽時沒寫。

如果一個地方的位置是不可能被對方佔領的,就先不衝,留著最後。走的時候儘量走中間的部分(參考樣例 1)且離家裡遠的地方。

但可能寫的比較劣,但又判的比較多。沒有注意利用估價函式而是直接貪心亂判(?,應該學著加點隨機化。

超市門口的遊戲機 (marbles)

先令 \(p=\dfrac{p}{p+q},q=\dfrac{d}{p+d}\)

對於第一問,我們不妨先算 \(f(n,m)\) 的情況。列舉向左走了幾步,於是有:

\[f(n,m) = q^m \sum\limits_{i=0}^n (n-i) \dbinom{m+i-1}{i} p^i \]

由廣義二項式定理得

\[\begin{aligned} \dfrac{1}{(1-x)^m} &= \sum\limits_{i \ge 0} \dbinom{m+i-1}{i} x^i \\ \dfrac{x}{(1-x)^2} &= \sum\limits_{i \ge 0} \dbinom{i+1}{i} x^{i+1} =\sum\limits_{i \ge 0} ix^i \end{aligned} \]

於是設

\[\begin{aligned} g(m) &= q^m \dfrac{1}{(1-px)^m} \dfrac{x}{(1-x)^2} \\ &= q^m \sum\limits_{k \ge 0} \dbinom{m+k-1}{k} p^k [x^k] \sum\limits_{i \ge 0} i x^i \\ &= q^m \sum\limits_{d \ge 0} [x^d] \sum\limits_{k=0}^d \dbinom{m+k-1}{k} p^k (d-k) \end{aligned} \]

於是要求 \(f(n,m)\) 的就是 \(g(m)\) 的第 \(n\) 項。

注意到 \(m\) 固定,直接遞推計算,每次計算 \(\dbinom{m+i-1}{i},i\dbinom{m+i-1}{i}\) 然後遞推計算就可以了。

第二問。

\[\sum\limits_{i \ge 0} f(i,h) \times (p_2^i \times (1-p_2))= (1-p_2) \sum\limits_{i \ge 0} f(i,h) \cdot p_2^i \]

後面那個東西就相當於

\[q^h \sum\limits_{d \ge 0} [x^d] \sum\limits_{k=0}^d \dbinom{h+k-1}{k} p^k (d-k) \cdot p_2^d \]

考慮把 \(p_2\) 帶入 \(x\),答案就是

\[(1-p_2^d) q^h \dfrac{1}{(1-p \cdot p_2)^h} \dfrac{p_2}{(1-p_2)^2} \]

第三問。同樣,前提前。

\[(1-p_2) \cdot (1-q_2) \sum\limits_{i \ge 0}\sum\limits_{j \ge 0} f(i,j) \cdot p_2^i \cdot q_2^i \]

轉化一下變成第二問。

\[(1-p_2) \cdot (1-q_2) \sum\limits_{m \ge 0} q^m q_2^m \dfrac{1}{(1-p \cdot p_2)^m} \dfrac{p_2}{(1-p_2)^2} \]

於是有

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \sum\limits_{m \ge 0} \left( \dfrac{q \cdot q_2}{1-p \cdot p_2} \right)^m \]

\(k=\dfrac{q\cdot q_2}{1-p \cdot p_2}\),於是又有

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \sum\limits_{m \ge 0} k^m \]

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \dfrac{1}{1-k} \]

「2022-03-16 省選模擬賽」

林間漫步 (wander)

首先注意到答案是可以二分的。那麼考慮二分一個答案 \(mid\),問每條路徑的費用是否都小於 \(mid\)

因為走的是樹的遍歷,那意味著一個子樹必須走完才能出去。於是設 \(f(u,a,b)\) 表示當前子樹是否能滿足,從 \(u\) 出發到第一個葉子節點的路徑長為 \(a\),最後一個葉子節點到 \(u\) 的路徑長是 \(b\),且所有路徑長度不大於 \(mid\)

注意到本題是二叉樹。所以左右判斷就可以了。於是有

\[f(u,a,b)=f(v_l,a,i) \& f(v_r,j,b) (i+j+w_l+w_r \le mid) \]

考慮優化 DP。考慮刪掉一些狀態。比如狀態 \(f(u,a,b)\)\(f(u,c,d)\),且滿足 \(a<c\)\(b<d\),那麼後者就沒用。

於是 \(f(u,a,b)\)\(a\) 排序,這樣對於相鄰兩項,如果 \(b_i<b_{i+1}\),那麼後者狀態就用了。意味著 \(b\) 是遞減的。

接著考慮轉移部分。貪心的考慮,所以對於一個狀態 \(f(v_l,a,b)\) 只需要找最小的 \(b_2\)\(f(v_r,a_2,b_2)\)

考慮用雙指標合併。複雜度是 \(\log n\) 級別的。

於是總複雜度 \(\mathcal{O}(n \log n \log v)\)

序列劃分 (divide)

首先顯然有 DP ,設 \(f(i)\) 表示到 \(i\) 的答案。列舉一個字尾 \(j\),答案就是 \(j \sim i\) 的結果乘上 \(f(j)\) 的和。

注意到字尾的貢獻是遞減的,且如果當前為 \(x\),只有前面 \(\operatorname{mex}\)\(x\) 的才會更新。

所以每次維護答案為 \(\operatorname{mex}=z\) 的字尾和 \(z\) 最後出現的位置 \(ls\) 即可。於是每次只要求 \(ls\),維護 \(ls\) 不在第一個非負整數。

線段樹二分即可。複雜度 \(\mathcal{O}(n \log n)\)

重排列 (permutation)

注意到不互質的數最後的相對位置不會改變。於是對於 \(\gcd(a_i,a_j) \neq 1 (i <j)\),考慮把 \(i \rightarrow j\),最後求出最大的拓撲序就好了。

但是注意 \(2,3,6\) 這種,如果 \(2 \rightarrow 6,3 \rightarrow 6\),結果是 \(3,2,6\),而顯然 \(2,6,3\) 更優。所以考慮對每一個連通塊,按照優先選最小值的順序 dfs,相當於連邊。

「2022-03-22 省選模擬賽」

小 F 與遊戲 (game)

我們把最後的序列劃分成 \(3\) 部分,\(1 \sim k-1,k,k+1 \sim n\)

對於第一部分,發現是結果一定兩個單調序列並起來。而後半部分是在雙端佇列中是單調的。

所以後半部分意味著只要 \(k\) 取完了,前後就可以隨意取。方案數 \(2^{n-k-1}\)

不妨設 \(f(i,j)\) 表示一個序列考慮了前 \(i\) 個數,已經填的最小值是 \(j\),假設第 \(i\) 個數是 \(x\)

則如果 \(x<j\),那麼把他加到當前序列末尾,\(f(i,x)\leftarrow\sum\limits_{j=x+1}^n f(i-1,j)\)

否則,只能加在另一個序列,為了防止算重,定義為能放第一個序列就放第一個序列,否則再放這裡。所以為 \(f(i,x)\leftarrow f(i-1,x)\)。注意當 \(i>n-x+1\) 的時候不合法。

做一個字尾優化,所以變成了 \(f(i,j)=f(i-1,j)+f(i,j+1)\)

發現這個東西長的很好看,發現把他折線一下就變成了組合數。變成了 \(\dbinom{n+m-2}{m-1} - \dbinom{n+m-2}{m-2}\)

兩個乘起來就可以了。

小 Z 與函式 (function)

把程式拆開。分成 resvs

首先對於 res 來說,就是交換順序對。所以對於一個位置 \(i\) 來說,他 res 的貢獻就是對 \(1 \sim i-1\) 中比他小的數。

需要注意的是,相等的數不會再次互動,所以這裡計算 res 需要去重。計算比他小的不重複的數的個數。

考慮 vs。他的實質意義就是,當前位置是否有進行過交換。顯然,如果前面的數都比他小,作為後面所有數的開頭。

考慮計算所有數再減去沒有貢獻的。

那意味著前面一個時間點後面的數會通過交換跑到前面來。這意味著,一個數在任意時刻操作後都不存在前面的一個數比他小,則他沒有貢獻。用 set 維護即可。

小 W 與騎士 (knight)

注意任何一個向量都可以拆成兩個已知的不平行向量的和 \((xa_x+xb_x,ya_y+yb_y)\)

所以提出每一組障礙和起點終點的 \((x,y)\),注意要是整數才滿足題意。

於是變成了向上或者右走 \(1\) ,不能經過那些障礙的經典問題。每個點的貢獻為 \((-1)^k \prod \dbinom{x_i-x_{i-1}+y_i-y_{i-1}}{x_i-x_{i-1}}\)

不妨設 \(f(i)\) 表示恰好經過 \(i\) 個障礙的貢獻。那麼轉移就是,列舉 \(j < i\),然後計算時候乘 \(-1\)

最後就是答案總數減去 \(\sum f(i)\)

如果是平行的兩個向量。那就是一維問題,直接暴力轉移即可。

注意判斷答案的無窮性和無解性,感謝偉大的 hack 資料。