2018HN省隊集訓


HNOI2018省隊集訓

Day 1

流水賬

T1 tree
換根+求\(lca\)+求子樹和,一臉bzoj3083遙遠的國度的既視感。子樹和討論一下就好了,\(lca\)?也是大力討論一波。
先寫了個線段樹標記永久化,一發過了小樣例,然后大樣例。。。沒幾組詢問就\(WA\)了。寫了個暴力,每次輸出求出來的\(lca\)(我怎么這么機智啊),發現\(WA\)了,然后就對着自己的大力討論大力魔改。大概是\(10:00\)的時候大樣例終於過了,沒寫拍(因為不會寫\(win\)下的拍qaq)。
T2 function
看出來了結論,一直在\(yy\)怎么用斜率搞一搞。最終還是沒能\(yy\)出來,交了個\(42\)的暴力。
T3 or
一開始還以為自己只會寫\(O(n2^k)\)的暴力\(dp\),然后轉念一想其實二進制位都是等價的,就寫了個\(O(nk^2)dp\)過了樣例。最近有些\(ntt\)上癮所以當然是順手敲了發\(ntt\)
預估得分\(100+42+59=201\),實際得分\(83+42+59=184\)
T1被卡常qaq,我活該大常數。

總結

得分比較穩定,該拿得分基本上都拿到了(卡常這件事出題人自己也沒想到)。T2在考場上缺乏去硬剛的信念與勇氣導致沒有做出來。T3的正解比較神仙。

簡要題解

tree

在換根的前提下子樹有三種情況:若詢問點不是根的祖先則子樹就是原來的子樹,若詢問點就是根則子樹就是整棵樹,若詢問點是根的祖先則子樹是整棵樹除去根所在的詢問點的那個兒子。這部分就是bzoj遙遠的國度
\(lca\)的情況相對復雜一些:若兩個點都在根的子樹中則\(lca\)就是在原樹中的\(lca\),若一個在一個不在則\(lca\)就是根,若兩個都不在,需要判斷兩點路徑和根到\(1\)號點路徑有沒有交,也就是判斷兩點在原樹中的\(lca\)是不是根的祖先,若不是則\(lca\)還是原樹中的\(lca\),否則\(lca\)是路徑交中深度最大的那個點。

function

首先一組詢問\((x,y)\)的答案是\(\min_{i\in[1,y]}S_y-S_i+A_i(x-y+i)\),其中\(S_i\)\(A_i\)的前綴和。
\(x-y\)為自變量,相當於在所有形如\(y=A_ix+A_ii-S_i\)的直線中找一個最小值,維護下凸殼就行了。
由於存在一些特殊性質所以可以用單調棧維護凸殼。

or

首先觀察一下\(dp\)式:

\[dp[i][j]=\sum_{k=1}^{j}dp[i-1][j-k]\times\binom{j}{k}\times2^{j-k} \]

也就是

\[\frac{dp[i][j]}{j!}=\sum_{k=1}^{j}\frac{dp[i-1][j-k]\times2^{j-k}}{(j-k)!}\times\frac{1}{k!} \]

構造指數型生成函數

\[F_i(x)=F_{i-1}(2x)\times (e^x-1) \]

\(e^x=\sum_{i=0}^{\infty}\frac{1}{i!}x^i\)\(F_{i-1}(2x)\)是因為把\(2^{j-k}\)和生成函數里的\(x^{j-k}\)合並了)

\[F_n(x)=\prod_{i=0}^{n-1}e^{2^ix}-1 \]

\(n\)是偶數的時候滿足\(F_n(x)=F_{\frac n2}(x)\times F_{\frac n2}(2^{\frac n2}x)\)
所以倍增求一下就好了,分\(n\)是奇數還是偶數討論一下(偶數直接除二,奇數減一變成偶數)

落實情況

題目 tree function or
完成情況 corrected corrected corrected

Day 2

流水賬

T1看了半天發現是不會做的。先寫了\(30pts\)暴力,然后發現“只有一個質因子”就可以完全按照大小來做,就寫了個\(BIT\)(結果\(laofu\)說值的個數很少只要開桶就行了)
T2先寫了個暴力打個表,想着\(40pts\)的狀壓結果推出來了一個\(O(n)\)的式子,直接就\(80pts\)了。
T3\(10pts\)暴力
T2打表,塊大小\(50w\)打了\(60k\)(三個表),本機跑極限數據開\(O2\)\(5s\)
預估得分\(40+80+10=130\),實際得分\(40+0+10=50\)
由於日常考試分不清到底測文件夾內還是文件夾外所以習慣性地把三份代碼都粘到文件夾外,我也不知道為什么就按成了\(Ctrl-x\)。於是愉快地“未找到源程序”qaq。
以后這種事情還是不要干了吧。

總結

我覺得這個分應該是我的極限實力了吧qaq。

簡要題解

walk

留坑

game

首先\(O(n)\)的答案式是\(n!-2\sum_{i=0}^{n-1}i!+\sum_{i=0}^{n-2}i!(n-i-1)+1\)
大力開一下$$原式=n!-2\sum_{i=0}^{n-1}i!+(n-1)\sum_{i=0}^{n-2}i!-\sum_{i=0}^{n-2}i!\times i+1\=n!-2\sum_{i=0}^{n-1}i!+(n-1)\sum_{i=0}^{n-2}i!-\sum_{i=0}^{n-2}[(i+1)!-i!]+1\=n!-3\sum_{i=0}^{n-1}i!+n\sum_{i=0}^{n-2}i!+2\=(n-3)\sum_{i=0}^{n-1}i!+2$$
所以就只要求一個階乘前綴和,打表階乘以及前綴和即可。

string

詢問離線,從小到大枚舉\(r\),維護每個左端點的答案。
有一個這樣的性質:一個串的所有回文后綴一定可以被分為不超過\(\log n\)個等差數列。
先考慮最長回文后綴,那么所有長度超過它的一半的回文后綴一定會構成等差數列(這個畫畫圖就好了),要想不滿足等差必須讓長度減小一半,所以最多只有\(\log n\)個等差數列。
每個等差數列會讓一段連續的\(l\)的答案增大\(1\)。具體來講,這一段的左端點是等差數列中最大的回文后綴上一次出現的位置+1(如果之前沒出現過就是\(1\)),右端點是等差數列中最小的回文后綴的出現位置。
用線段樹維護每個回文后綴最后出現的位置(為保證復雜度修改的時候只能修改最長回文后綴,所以查詢的時候要查該回文后綴在回文樹上的整棵子樹),然后用樹狀數組維護每個左端點的答案。

落實情況

題目 walk game string
完成情況 N/A corrected corrected

Day 3

流水賬

T1想了一個\(O(n\log^2n)\)的假算法,過了大樣例,感覺很對的樣子。
T2看上去像是個\(dp\),不管了先去做T3。
T3打表,觀察規律無果,\(10pts\)滾粗。
發現T1的算法是假的,但是並沒有想到正解。
T2\(yy\)了半天寫了一個\(O(n^3)\)的做法,下考前寫了鏈,感覺\(O(n^2)\)的做法也不是很難,只是沒有想清楚具體怎么實現所以就沒有寫。
預估得分\(??+50+10=??\),實際得分\(95+50+10=155\)
沒想到T1亂搞有\(95\)分,據說還有亂搞\(AC\)的。

總結

在T1上面糾結了太久,導致T2沒有把分數打滿。如果是在滿狀態下開T2的話應該可以拿到\(80\)分的樣子吧。

簡要題解

c

破環成鏈,對於\(l<r\)的線段,新加入線段\([l+m,r+m]\),否則加入線段\([l,r+m]\)。這樣就需要選出一個長為\(m\)的區間包含盡可能多的不相交線段。
考慮強制每一條線段作為第一條線段,根據貪心,每選過一條線段之后下一條選的線段是確定的。不妨記為\(nxt_i\),那么我們只關心每一條線段跳多少次\(nxt\)后達到\(m\)長度。把\(nxt\)數組倍增實現即可。

a

暴力枚舉這\(k\)個人路徑的交,這肯定是樹上的一條簡單路徑。那么這條路徑對答案的貢獻就是\(f_x\times f_y\),其中\(x,y\)是枚舉的兩個點,\(f_x\)表示在\(x\)的子樹中選出\(k\)個點使得兩兩\(lca\)\(x\)的方案數。
如果\(x,y\)其中一點是路徑的\(lca\),不妨設是\(x\),那么對答案的貢獻應該是\(g_{x,y}\times f_y\),其中\(g_{x,y}\)表示點\(x\)\(y\)為根方向時的\(f\)值。
考慮滿足“兩兩\(lca\)\(x\)”這一條件,顯然需要有若干個點在\(x\)上,然后在\(x\)的每個子樹中選至多一個點。
設一個多項式\(P_x(x)\)表示在\(x\)中選出\(i\)個子樹的方案數的生成函數,鑒於每棵子樹只能選一個,所以\(P(x)=\sum_{son}(1+size_{son}x)\times(1+x+x^2+x^3+...)\),對於每個點分治\(FFT\)即可,這樣的總復雜度是\(O(n\log^2n)\)的。
然后求\(f\)的話就是\(\sum_{i=0}^{\min(k,deg_x)}A_k^i\times [x^i]P_x(x)\),算這個的復雜度是\(O(n)\)的。

這樣可以求出所有的\(f\),至於求\(g_{x,y}\),其實就是求其生成函數\(Q_{x,y}(x)=P_x(x)\times\frac{1+(n-size_y)x}{1+size_yx}\),這個東西是一個多項式除以二項式的形式,是可以做到\(O(deg)\)的。具體使用姿勢可以參考\(CTSC2018\)假面一題。

這樣對於每個兒子都直接\(O(deg)\)求一遍的話復雜度可能會退化成\(O(n^2)\)。發現除掉的內容只和子樹\(size\)有關,而一個點不同大小的兒子最多只有\(O(\sqrt n)\)個,所以只要記一下,對\(size\)相同的兒子不重復處理即可。復雜度\(O(n\log^2n+n\sqrt n)\)

i

打表發現\(f(i)\)表示\(i\)在序列中出現的次數。
考慮一些東西的實際含義:\(g(i)\)表示前\(i\)個數出現的總次數,那么也就是第\(i\)個數最后出現的位置。
又因為\(g(i)\)\(f(i)\)的前綴和,所以\(g(f(i))-f(f(i))=g(f(i)-1)\),表示最后一個值為\(f(i)-1\)的位置(下標)。
也就是說\(h(i)\)就表示從\(i\)往前每一段相同數字的最后一位的\(g(g(i))\)之和。
考慮\(g(g(i))\)怎么求。

\[g(g(i))-g(g(i-1))=\sum_{j=g(i-1)+1}^{g(i)}f(i)\\=\sum_{j=g(i-1)+1}^{g(i)}i=i\times f(i) \]

所以\(g(g(i))=\sum_{j=1}^{i}j\times f(j)\)
打表可以發現當\(n\)達到\(10^9\)\(f(n)\)不會超過\(10^6\),所以可以按照\(f(i)\)分段處理,復雜度大概是\(O(T\times10^6)\)

落實情況

題目 c a i
完成情況 corrected N/A corrected

Day 4

流水賬

\(wfj\)的題,預感大事不妙。
T1這顯然就是\(wfj\)在考場上看錯題的那個版本吧。強行給\(HNOId2t3\)加一維狀態復雜度大概是\(O(n^2d^2)\)?反正能過前兩個\(subtask\)
T2只會\(O(2^{x^2}n^2)\)的暴力。
T3我發現我不會\(O(n)\)做后面兩問,所以就爆零了。
想寫個T2的退火,結果沒有獲得比暴力分更高的分數。
大概是\(12:00\)的時候一群一中\(dalaoAK\)離場了,好強啊。
預估得分\(30+15+0=45\),實際得分\(30+15+0=45\)
不得不說穩得一匹。

總結

希望接下來的幾天里沒有今天這樣的毒瘤場。
p.s. \(wfj\)被阿掉了(不過他本人似乎還不滿足?)

簡要題解

y

凸優化

s

套結論

f

不會

落實情況

題目 y s f
完成情況 N/A N/A N/A

Day 5

流水賬

T1一眼網絡流的既視感,一開始想着建立二分圖,然后。。。一個黑點匹配兩個白點?還要最大權匹配?不太可做吧。感覺自己不太會寫\(30pts\)的狀壓\(dp\),只要硬着頭皮剛正解。
大概是\(9:00\)左右的樣子靈感突顯:拆成一個三分圖。然后二十分鍾敲完費用流,一測大樣例就過了,爽。
T2看了一眼,就是用樹剖維護\(bitset\)然后搞一搞,但是統計答案我不會啊,只好去看T3。
T3這這這不是我哪天在洛谷上見過的原題嗎?有一個很顯然的結論:枚舉左端點,右端點從左往右掃排名一定單調減,權值一定單調不降,所以就可以二分交點,問題轉化為求一個子串在原串中的排名的問題。又是因為不太會寫\(30pts\)所以選擇剛正解,然后胡亂\(yy\)了一個\(O(n\log^2n)\)的做法,希望不會被卡常。
后來發現T1也是原題。跑到洛谷上交了兩道題,於是莫名變成了\(IOI\)賽制。(雖然基本上都是一遍過的)
T2發現了一種網絡流統計答案的方法,但是寫完T3已經\(12:30\)了,又覺得網絡流應該跑不過幾個點,就沒寫了(結果蘿卜跟我講網絡流有\(45pts\)?)
預估得分\(100+5+100=205\),實際得分\(100+5+100=205\)

總結

T2沒有嘗試更高的分數比較可惜。

簡要題解

marshland

我們稱\(X+Y\)為奇數也就是有危險度的點為黑點,\(X+Y\)為偶數也就是沒有危險度的點為白點。
而白點內部又分為兩類:行號(列號也行)為奇數和偶數的點,將其分別稱為\(1\)類點和\(2\)類點。
可以發現每一塊石頭都恰好覆蓋了一個黑點、一個\(1\)類點和一個\(2\)類點。
所以建立一個類似三分圖的模型:(用\((w,cost)\)表示容量為\(w\)費用為\(cost\)的邊)
\(S\)向每個\(1\)類點連\((1,0)\),把每個黑點拆成入點和出點,每個\(1\)類點向相鄰的每個黑點的入點連\((1,0)\),每個黑點的入點向出點連\((1,V_{i,j})\),出點向相鄰的\(2\)類點連\((1,0)\)
限制總流量不超過\(m\),即求的是最大費用可行流而非最大費用最大流。仔細想一想就會發現石頭數量越多並不能保證解不更劣。

party

首先這幾個人聚會的點一定是\(lca\)
\(bitset\)維護每個點到樹鏈剖分中這個點的\(top\)的路徑並,再開一棵線段樹維護區間並集。
這樣查詢路徑的時候就可以做到一個\(\log\)
考慮求出每個點到\(lca\)路徑的\(bitset\),再求\(dp(S)\)表示\(S\)集合中的點到\(lca\)路徑的並。
根據霍爾定理答案就是\(\min(\frac{dp(S)}{|S|})\)
復雜度是\(O((n+qc\log n+q2^c)\frac {m}{\omega})\)

platform

有一個很顯然的結論:枚舉左端點,右端點從左往右掃排名一定單調減,權值一定單調不降,所以就可以二分交點。
問題轉化為求一個子串在原串中的排名的問題,也就是求原串中有多少個本質不同子串的字典序比給定子串的要大。
我們假設要算的是子串\(S_{l..r}\)
在后綴排序中排在\(l\)后面的所有后綴中本質不同的子串的字典序一定都比\(S_{l..r}\)的要大。
而排在前面的呢?一定沒有嗎?
我們發現保證沒有的情況當且僅當\(S_{l..r}\)這個子串是在后綴\(l\)中第一次出現。
如果是第一次出現那么可以直接計算答案\(ans_{S_{l..r}}=sun_n-sum_{Rank_l}+n-r+1\)
否則我們就找到這個子串第一次出現的位置然后再計算即可。
如何求第一次出現的位置?在\(SA\)上二分\(lcp\)即可。
復雜度兩個\(\log\),然而比\(std\)一個\(\log\)的線段樹跑得還快qaq。

落實情況

題目 marshland party platform
完成情況 corrected corrected corrected

Day 6

流水賬

瀏覽一遍題目以后發現只有T2比較可做,就想了想容斥那方面的,也就是計算所有包含\(0,1,2,3\)對矛盾的三元組。
\(0\)想了蠻久怎么\(O(1)\)算,然后。。。我選擇寫\(O(n)\)的。
\(1\)直接枚舉邊,感覺比\(0\)的還要好寫一點。
\(2\)的話枚舉點,我開了個\(vector\)瞎搞,還帶個排序的\(\log\)。反正這也不是復雜度瓶頸。
\(3\)就是前天晚上葉佬講過的東西,這個結論的證明以及實現應該都不難。
沒造極限數據測,所以存在翻車的可能性。
然后T1寫了\(A_i,B_i>0\)的點,交了一個\(O(n!^2)\)的鬼玩意。T3寫了個\(Hash\)
預估得分\(20+100+20=140\),實際得分\(30+100+20=150\)
某人又被C++11卡CE了

總結

會寫的都寫了。T2沒造極限數據測比較容易出鍋,這次沒翻不保證以后也不會翻。

簡要題解

gift

對於排列\(a,b\),連邊\((a_i,b_i)\),這樣會形成若干個環。每個環需要交換環長\(-1\)次,所以答案就是\(n-\)環的數量。
現在我們的排列是不完整的,也就是說構出來的圖也是不完整的。因為答案只和環的個數有關,所以我們可以把一些已經確定了的部分合並起來,這樣圖中就只剩下了四種東西:完整的環、起點確定終點不確定的鏈、起點不確定終點確定的鏈以及起點終點都不確定的鏈。
我們求出每一種東西的個數,這個可以直接\(O(n)dfs\)
發現完整的環在計算過程中是沒有貢獻的,只是把答案全部向右移了一位,所以可以不用考慮。
我們需要用剩下的三種東西拼出若干個環的方案數,而實際上只要計算出用一種東西拼出若干個環的方案數然后卷積起來就可以了。
對於起點終點都不確定的鏈,這個的方案數是\(S[s1][i]\),其中\(S[i][j]\)表示第一類斯特林數,\(s1\)是這種鏈的數量。這個東西可以\(O(n^2)\)求出。
對於起點終點有一個確定的鏈,方案數不好直接求,但是可以求拼出至少\(i\)個環的方案數。
\(f[i]=\sum_{j=i}^{n}C[n][j]\times S[j][i]\times A[m+n-j][n-j]\)
其中\(n\)是這種鏈的數量,\(m\)是起點終點都不確定的鏈的數量,\(S\)是第一類斯特林數,\(C,A\)分別是組合數與排列數。
然后做一個簡單容斥即可。復雜度\(O(n^2)\)
注意最后還要乘上一個階乘。

girls

總答案=任意三點的貢獻-包含至少一對矛盾的三點的貢獻+包含至少兩對矛盾的三點的貢獻-包含至少三對矛盾的三點的貢獻。
第一部分可以考慮枚舉其中一個\(O(n)\)計算。
第二部分枚舉邊,計算剩下的\(n-2\)個點\(O(m)\)
第三部分枚舉點,對一個點的相鄰點排序,然后分當前點是最小、次小還是最大三種情況討論,\(O(n\log n)\)
第四部分就是三元環計數,可以將無向圖重定向,每條邊都指向度數較大的那個點,若度數相同則指向標號較大的點。可以發現這樣構出了一個\(DAG\),而且保證每個點的出度不超過\(\sqrt m\)
因為對於一個原圖中度數小於\(\sqrt m\)的點顯然成立,對於一個原圖中度數大於等於\(\sqrt m\)的點,要連向他的點的度數至少大於等於\(\sqrt m\),然后這樣的點至多只有\(\sqrt m\)個,於是證明這個結論成立。
\(DAG\)中的一個三元環一定是有兩條邊共終點,我們考慮枚舉剩下的那一條邊,這樣這條邊起點終點的鄰接點集合的交就是找出來的那些三元環。這樣一來其實三元環的數量也不超過\(m\sqrt m\),復雜度\(O(m\sqrt m)\)

string

落實情況

題目 gift girls string
完成情況 corrected corrected N/A

Day 7

流水賬

新一代的毒瘤題啊。
T1只會寫爆搜,然后寫了樹的\(10pts\)。(這好歹也是正解的第一步啊)
T2想偏了,卡在高斯消元這個問題上,於是毫無進展,成功爆零。
T3想寫個\(10pts\)
預估得分\(20+0+10=30\),實際得分\(20+0+0=20\)
T3直接乘會爆\(long\ long\),所以需要加一些奇妙的東西或者直接int128

總結

其實今天的題目並沒有想象中的那么毒瘤吧(畢竟自己還是可以改出來的)。
可能是受到了周圍環境的影響導致沒有做到最好的投入吧。

簡要題解

inkmaster

對於樹的情況,答案為\(C\times(C-1)^{n-1}\)
在仙人掌上,顯然每一個環是獨立的,我們在計算這個環的時候不算環根,這樣把每個環的方案乘起來再乘個\(C\)就是最后的答案了。
考慮每一個環,某個環如果直接按照樹的方法去計算,會多算上首尾相同的方案,所以可以考慮容斥,減去強制首尾相同的方案(這時候倒數第二個點的顏色可能會與首尾相同),加上三個點相同的方案,減去四個...列出式子來就是:(假設環的大小不算環根是\(sz\)

\[(C-1)^{sz}-(C-1)^{sz-1}+(C-1)^{sz-2}+...\pm (C-1) \]

\(\pm\)取決於\(sz\)的奇偶性)
這是一個首項是\(C-1\)公比是\(1-C\)的等比數列,求一下和:

\[\pm(C-1)\frac{1-(1-C)^{sz}}{1-(1-C)}=\pm(C-1)\frac{1-(1-C)^{sz}}{C} \]

這樣就可以再\(O(\log n)\)的時間內計算每一個環的貢獻了。
現在的問題在於:環的數量可以是\(O(n)\)個,一個個計算,復雜度是\(O(qn\log n)\)
發現式子只和環的大小有關,而一棵\(n\)個節點的樹上不同大小的環的個數是\(O(\sqrt n)\)級別的。把大小相同的環的貢獻放在一起算,復雜度就是\(O(q\sqrt n\log n)\)

branching

發現在每一個位置選擇\(2\)操作的結果都是一樣的,所以有一個比較顯然的結論:存在一個\(x\)值使得對於所有距離終點不超過\(x\)的點都選擇直接一步步走過去,而其余的點就選擇進行\(2\)操作。
設進行\(2\)操作走到終點的期望步數為\(x\),則有方程:

\[x=1+\frac{\sum_i\min(dis(i,T),x)}{n} \]

因為有一個\(\min\)所以沒有辦法直接解這個方程,發現右邊這個函數的斜率是遞減的,可以考慮二分\(x\)。二分到整數即可,因為只要二分到整數以后,那個\(\min\)里面哪些點取\(dis(i,T)\)哪些點取\(x\)就已經確定了,就可以解方程算出\(x\)了。
現在僅剩的一個問題在於怎么計算右式。我們發現就是計算距離\(T\)不超過\(x\)的點有多少個以及他們到點\(T\)的距離和。這個就直接動點分一下就好了嘛。
自己寫了一個\(O(n\log^3n)\)的做法,題解做法是\(O(n\log^2n)\)的,回去再看看qaq。

euclid

落實情況

題目 inkmaster branching euclid
完成情況 corrected corrected N/A

Day 8

流水賬

T1這這這線段樹維護矩陣然后不就做完了嗎。但是這個復雜度貌似有點鬼啊qaq。
T2這什么鬼題目啊,出題人毒瘤吧。
T3看一眼數據范圍感覺像是\(FWT\),然后就\(yy\)了一個很有道理的\(O(\sum k_i+m2^m)\)做法。一發過大樣例。
然后滾回去寫T1,倒是一下子就寫完了,也沒怎么\(debug\)就過了樣例。預估\(75\)分。
T2寫了個退火,就是完全隨機亂走的那種。
下考前意識到沒算退火的時間復雜度,心想着算了算了反正這題也是沒分的就沒管了。
預估得分\(75+0+100=175\),實際得分\(65+8+100=173\)
T1構造轉移矩陣的時候寫的是=1而不是++然后\(\sum|s_i|=0\)的點就\(G\)了。
然后T2\(spj\)出鍋,喜聞樂見.jpg

總結

T1的復雜度是假的這我能說什么。
T2的正解是假的這我能說什么。
T3全場艹標算這我能說什么。

簡要題解

kill

對所有不合法串構造\(AC\)自動機,然后在一些禁止節點上打上標記,\(dp\)即可。
考慮動態修改還要區間查詢,所以用矩陣實現\(dp\)轉移,用線段樹維護區間矩陣乘積。禁止節點在\(dp\)中是沒有任何意義的,所以把除禁止節點外的所有節點重新標號再做矩陣乘法,復雜度\(O(q\log n(\sum s_i-m)^3)\)。能過。

plitics

eat

考慮枚舉選出了\(k\)個拼盤后或起來的結果,一共是\(2^m\)種狀態。因為我們可以算出每一種狀態的價值,所以我們只關心每一種狀態被構造出來的方案數。
\(f_i\)表示是\(i\)集合的子集的集合數量,那么\(g_i=\binom{k}{f(i)}\)即表示選出\(k\)個盤子或起來集合是\(i\)的子集的方案數。
那么只要求出\(f_i\),算出\(g_i\)再想辦法還原回去就好了。
顯然是可以\(FWT\)的吧,復雜度不算讀入是\(O(n+m2^m)\)
所以說這題的復復雜度瓶頸實際上在讀入。

不過大家寫的貌似普遍都是,利用期望的線性性,對每一位分別考慮,然后復雜度就是\(O(m)\)的,非常優秀。

感覺\(std\)的做法比較像bzoj3771Triple這道題的加強版,就是大力容斥,然后利用系數是帶符號第一類斯特林數的性質做到\(O(km2^m)\)

落實情況

題目 kill plitics eat
完成情況 corrected corrected? corrected


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM