Comet OJ - Contest #2 簡要題解
A
模擬,復雜度是對數級的。
code
B
首先易知\(p\in[l,r]\),且最終的利潤關於\(p\)的表達式為\(\frac{(p-l)(\frac{L+R}{2}-p)}{r-l}\),二次函數求最值即可。
code
C
枚舉獨立集點數即可。\(\sum_{i=0}^n\binom nip^{\binom i2}\)。
code
D
樹上的任意一個滿足\(|S|\ge2\)的點集\(S\)均有一個唯一的中心,即直徑的中點(可能是一個點也可能是一條邊),因此可以在該點集的中心處計算該點集的貢獻。
枚舉中心\(i\),枚舉直徑長度\(j\),要求在\(i\)點至少兩棵不同子樹里選與\(i\)距離恰好為\(j\)的點,距離小於\(j\)的點任選。復雜度\(O(n^2)\)。
code
E
原圖是一片環套樹森林。首先考慮把森林縮掉,對於一個葉子節點\(v\)與其父親\(u\),可以令\(p_u\gets p_u+(1-p_u)p_vs_v\),並刪除點\(v\)。如此操作后圖中就只剩下若干個環了。
對於環上的任意一點計算答案,可以先把這個點的出邊斷掉,再視作一條鏈暴力計算,復雜度\(O(n^2)\)。考慮當前一個人以\(x\)的概率醒來的時候,后一個人醒來的概率可以表示成\(ax+b\)的形式,其中\(a,b\)均為只與當前這個人有關的常量。不難發現這種運算滿足結合率,因此對環維護前后綴,每次\(O(1)\)合並答案即可,復雜度\(O(n)\)。
比賽的時候無腦上了棵線段樹,做法上沒有本質區別。code
F
被修修教育了。。。
我們要求對於每個\(i\),將第\(i\)個二項式除去后與\(a_i\)點乘的結果。
考慮分治。設$$L(x)=\prod_{i=1}^{n/2}(p_ix+1-p_i)=\sum_{i=0}^{n/2}l_ix^i\R(x)=\prod_{i=n/2+1}^{n}(p_ix+1-p_i)=\sum_{i=0}^{n-n/2}r_ix^i$$
假設我們要求\(i\in[0,n/2]\)的答案,由於最終答案一定是\(\sum_{j=0}^{n/2-1}\sum_{k=0}^{n-n/2}l'_jr_ka_{j+k}\)的形式,而\(r_k\)對於左邊的所有\(i\)都是定值,因此可以考慮令\(a'_j=\sum_{k=0}^{n-n/2}r_ka_{j+k}\)然后用新的\(a'\)遞歸左邊,右邊同理。
這樣就只需要在每層分治時做兩次卷積就好了,復雜度仍然是\(O(n\log^2n)\),不過常數優秀不少。
以下是原題解。
orz suika
先求出\(F(x)=\prod_{i=1}^n(p_ix+1-p_i)\),然后對於每個\(i\),計算\(\frac{F(x)}{p_ix+1-p_i}\)與\(a_i\)數組點乘的結果。
為了方便處理,我們令\(w_i=\frac{1-p_i}{p_i}\)(題目保證\(p_i\in(0,1]\)),於是\(F(x)=\prod_{i=1}^np_i(x+w_i)\)。由於\(\prod_{i=1}^np_i\)是常數,故下文中均將其忽略。
不難發現問題大致是個退背包的模型,即先往背包里加入\(n\)個物品,然后每次刪去一個。
假設當前求的是第\(k\)個物品的答案,考慮設$$F(x)=\prod_{i=1}^n(x+w_i)=\sum_{i=0}^nf_ix^i\G(x)=\prod_{i=1,i\neq k}^n(x+w_i)=\sum_{i=0}^{n-1}g_ix^i$$
那么就有遞推式
將這個遞推式暴力展開
於是我們要求的東西就變成了
令\(coef_j=\sum_{i=0}^{n-1-j}a_if_{i+j+1}\),則\(ans_k=\sum_{j=0}^{n-1}coef_j(-w_k)^j\),多項式多點求值即可。求\(coef_j\)的過程只需要一個卷積,因此總復雜度\(O(n\log^2n)\)。
code