原文鏈接 www.cnblogs.com/zhouzhendong/p/ECfinal2019.html
A
枚舉一下向量然后看一下這個向量有多少種放法就好了。
B

C
考慮已知一個多項式 \(g\),求 \(f = g ^ k\) 的前 \(n\) 項系數。
我們有 \(f' g = k g'f\),我們發現我們只需要知道 \(f(0)\),就可以在 \(n|g|\) 的時間復雜度內推出結果。
注意這里的 \(k\) 可以不是整數。
我們考慮上述問題的拓展:
有一個二元函數 \(g(x,y)\),求 \(f = g ^ k\) 的 \(x^iy^j(1\leq i\leq n,1\leq j\leq m)\) 項系數。
我們發現
於是我們就把問題轉化成求一元多項式 \(f(0,y)\),套用之前的套路即可。時間復雜度為 \(O(nm|g|)\)。
我們發現狄利克雷卷積就是一個關於各個質數的多元多項式卷積。直接拓展一下上述做法就可以在 \(O(n \log ^2 n)\) 的時間復雜度內解決問題。
但是,其實我們可以發現,如果常數項為 \(1\),那么上述過程中只要 \(k\) 在模意義下不變,答案就不變。於是假設 \(t \equiv \frac 1k \pmod {P}\),那么 \(g ^ \frac 1k = g ^ t\)。於是對於這個題我們只需要做一下狄利克雷卷積快速冪即可。時間復雜度是 \(O(n \log n \log P)\)。
D
先考慮子樹dp,對於每一個節點 \(x\),計算最晚什么時候到點 \(x\),使得能夠遍歷子樹 \(x\) 中的點后回到並離開點 \(x\)。
對於一個 \(x\),我們記最晚到達時間為 \(a_x\),記在子樹 \(x\) 中要花費的時間為 \(b_i\)。
然后我們記 \(a'_x,b'_x\) 為從 \(fa(x)\) 到子樹 \(x\),遍歷完子樹再回到 \(fa(x)\) 的最晚到達 \(fa(x)\) 時間,和這一過程總用時,不難發現 \(a'_x = a_x -1, b'_x = b_ x + 2\)。
然后我們考慮如何計算 \(a_x,b_x\)。如果我們已經知道了遍歷 \(x\) 的所有子樹的順序是 \(y_1,y_2,\cdots,y_k\),則容易發現 \(b_x = \sum_{1\leq i \leq k} b'_{y_i}, a_x = \min_{1\leq i\leq k}(a'_{y_i} - \sum_{1\leq j< i} b'_{y_j})\)。接下來我們貪心選擇遍歷子樹的順序。設 \(s = \sum_{1\leq i\leq k} b_{y_i}\)。我們來考慮最后一個位置放什么。假設我們取的是 \(y_k\),那么 \(a_x \leq a'_{y_k} - (s - b'_{y_k}) = a'_{y_k} + b'_ {y_k} - s\)。簡單分析即可發現最后一個數是使得 \(a'_{y_i} + b'_{y_i}\) 最大的 \(i\)。於是最優序列就是按照 \(a'_{y_i} + b'_{y_i}\) 升序排序的序列。
然后考慮設 \(dp_x\) 為從節點 \(x\) 開始遍歷完子樹並一去不返的最晚到達 \(x\) 時間。轉移類似。
E
先把所有鏈求出來。
對於一條鏈,我們可以發現,移動到這條鏈的邊權和是一個關於這條鏈的最終流量的分段常數函數。
於是我們只需要維護一個堆,每次貪心選代價最小的鏈即可。
F
G
H
我們發現一個長度大於等於 \(n/2\) 的等比數列一定滿足一個性質:對於這個等比數列的所有相鄰元素對,在原序列中坐標差小於等於1的至少有約 \(n/4\) 個。
於是我們只需要把原序列中坐標差小於等於1的點對之間的倍數拿出來,找所有出現次數大於那個閾值的求最長序列即可。
I
J
我們考慮找到最小值所在的位置,假設是 \(i\)。於是在 \(p_{i - c},p_{i-c+1}\cdots, p_{i - 1}\) 上的數都可以隨意排列。接下來,如果 \(p_1..p_{i-1}\) 的最小值(設為 \(v\))在 \(p_{i-c},\cdots,p_{i-1}\) 中,那么,我們發現 \(p_{i-2c},\cdots,p_{i-1}\) 也幾乎可以隨意排列。幾乎是指除了要保證 \(v\) 在后 \(c\) 個位置外,其他的都可以在這個范圍內隨意排序。
假如 \(p_1,\cdots, p_{i-1}\) 中的次小值在 \(p_{i-2c},\cdots , p_{i-1}\) 中,那么也可以類似推理。
於是我們就推出了關鍵的性質。
我們遞歸解決一個問題:solve(L,R,vl,vr),表示已知左側搞出了 \(vl\) 個,右側搞出了 \(vr\) 個。如果 \((vl+vr)\cdot c > R-L+1\),說明剩下的數可以在 \([L,R]\) 中隨便放;否則假設剩下的數中的最小值在位置 \(k\),容易發現 \(k\) 只能被左側或者右側中的最多一側安排,那么如果能被安排,那么 \(vl++/vr++\);否則的話,把問題分成兩部分:solve(L,k-1,vl,1),solve(k+1,R,1,vr)。
細節自理。
K
我們可以每次找一條邊,滿足它恰好有一側是無限區域,且邊權盡量小。我們發現,如果最小割經過了它另一側的有限區域,則必然經過它。所以我們可以將組成這個有限區域的所有邊權值加上這條邊的權值,並刪除這條邊。
不斷執行這樣的操作,最終可以將圖變成一棵樹。跑 kruskal 即可。
L
M
我們可以把每一個數 \(t\) 寫成 \(t = x ^ y\) 的形式,其中 \(x\) 盡量最小化。
然后按照 \(x\) 分組,暴力枚舉選擇的集合即可。
