cometojhtml
模擬,複雜度是對數級的。
code數組
首先易知\(p\in[l,r]\),且最終的利潤關於\(p\)的表達式爲\(\frac{(p-l)(\frac{L+R}{2}-p)}{r-l}\),二次函數求最值便可。
code函數
枚舉獨立集點數便可。\(\sum_{i=0}^n\binom nip^{\binom i2}\)。
codeui
樹上的任意一個知足\(|S|\ge2\)的點集\(S\)均有一個惟一的中心,即直徑的中點(多是一個點也多是一條邊),所以能夠在該點集的中心處計算該點集的貢獻。
枚舉中心\(i\),枚舉直徑長度\(j\),要求在\(i\)點至少兩棵不一樣子樹裏選與\(i\)距離剛好爲\(j\)的點,距離小於\(j\)的點任選。複雜度\(O(n^2)\)。
codespa
原圖是一片環套樹森林。首先考慮把森林縮掉,對於一個葉子節點\(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)\)。
比賽的時候無腦上了棵線段樹,作法上沒有本質區別。code3d
被修修教育了。。。
咱們要求對於每一個\(i\),將第\(i\)個二項式除去後與\(a_i\)點乘的結果。code
考慮分治。設\[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\]htm
假設咱們要求\(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'\)遞歸左邊,右邊同理。blog
這樣就只須要在每層分治時作兩次卷積就行了,複雜度仍然是\(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\]
那麼就有遞推式
\[g_i=f_{i+1}-g_{i+1}w_k(0\le i<n,g_n=0)\]
將這個遞推式暴力展開
\[g_i=\sum_{j=0}^{n-1-i}(-w_k)^jf_{i+j+1}\]
因而咱們要求的東西就變成了
\[ans_k=\sum_{i=0}^{n-1}a_ig_i=\sum_{i=0}^{n-1}a_i\sum_{j=0}^{n-1-i}(-w_k)^jf_{i+j+1}\\=\sum_{j=0}^{n-1}(-w_k)^j\sum_{i=0}^{n-1-j}a_if_{i+j+1}\]
令\(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