一句話題解2

洛谷P6158 封鎖

給出一個nnn*n的網格圖,每條邊有兩個邊權。求一個左上角到右下角的割使得(第一個邊權之和)*(第二個邊權之和)最小。
n400n\le 400

跟最小乘積生成樹的做法類似,把每種方案看成二維平面上的一個點(x,y)(\sum x,\sum y),其中x,yx,y分別爲兩個邊權,那麼答案一定在下凸殼上。先分別找到橫座標最小和縱座標最小的點,然後通過設置邊權來找到在它們下方且離它們最遠的點,然後遞歸下去。

Codeforces 1305F Kuroni and the Punishment

給出nn個數,每次可以將某個數加11或減11,並花費11的代價,且需要保證操作後仍然是正數。問最少花費多少代價,使得這nn個數的gcd\gcd大於11
n2105,ai1012n\le 2*10^5,a_i\le 10^{12}

注意到答案的上界是nn。因此最優情況下,操作次數不大於11次的數至少有n2\frac{n}{2}個。故只需要每次隨機選一個數xx,並暴力把x1,x,x+1x-1,x,x+1分解質因數,然後計算並取最優值即可。

Codeforces 1322B Present

給出a1,,ana_1,\cdots,a_n,求ai+aj(i<j)a_i+a_j(i<j)n(n1)2\frac{n(n-1)}{2}個數的異或和。
n400000,ai107n\le 400000,a_i\le 10^7

對每一位分別計算貢獻。假設當前是第ii位,則把nn個數在模2i2^i意義下排序,可以發現在每個數前面,且加上這個數能夠進位到2i2^i的一定是連續的一段,並且左端點單調不增。於是只要對2i2^i0/10/1的兩種情況分別討論即可。
時間複雜度O(nlogV)O(n\log V)

Codeforces 1322C Instant Noodles

給一個2n2n個點的二分圖,右邊的點有點權。設SS爲左邊的點的子集,N(S)N(S)爲屬於右邊且至少與SS中一個點有邊相連的點的集合,f(S)f(S)表示N(S)N(S)的點權和。對於所有可能的SS,求f(S)f(S)gcd\gcd
n500000n\le500000

考慮兩個交集爲空的集合S1,S2S_1,S_2S=S1+S2S=S_1+S_2對答案的限制是gcd(f(S1S2),f(S\S1),f(S\S2))\gcd(f(S_1\cap S_2),f(S\backslash S_1),f(S\backslash S_2))。可以理解成把右邊的點集的劃分作了限制。發現只有與左邊的點的連邊情況相同的點能夠分爲一組。於是先對連邊情況排序,然後把相同的分爲一組,並對每組的權值和求個gcd\gcd就是答案了。
時間複雜度O(nlogn)O(n\log n)

【Atcoder】【Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020】【E - Odd Sum Rectangles】

構造一個(2N1)(2M1)(2^N-1)*(2^M-1)0101矩陣,使得和爲奇數的子矩陣數量最多。
N,M10N,M\le 10

不妨假設NMN\ge M。固定子矩陣的左右邊界j1,j2j_1,j_2,令f(i)=S(1,i,j1,j2)f(i)=S(1,i,j_1,j_2),那麼左右邊界爲j1,j2j_1,j_2的子矩陣的貢獻爲f(i)f(i)00的個數乘11的個數。不難發現答案的上界爲(H2)2W(W1)2(\frac{H}{2})^2\frac{W(W-1)}{2}。下面構造一個滿足該上界的答案。
假設N=MN=M,且已經構造出大小爲(2N1)(2N1)(2^N-1)*(2^N-1)的合法方案。對於N+1N+1的情況,我們把矩陣的四個角落填上NN的方案,然後讓(2N,2N)(2^N,2^N)的值爲11,第2N2^N行和第2N2^N列的值爲00。不難驗證這樣的構造是滿足條件的。

Codeforces 1325E Ehab’s REAL Number Theory Problem

給出nn個數a1,,ana_1,\cdots,a_n,滿足aia_i有不超過77個因子。問最少選出多少個數,使得這些數的乘積是完全平方數。
n105,ai106n\le 10^5,a_i\le 10^6

aia_i的平方因子除掉後,就只剩下一個或兩個指數爲11的素因子。若aia_i是素數,則在aia_i11之間連邊,否則在aia_i的兩個素因子之間連邊,答案就是圖中的最小環。
求最小環可以從每個點出發bfs,把bfs樹建出來後在所有非樹邊組成的環中挑一個最小的。
這樣做是O(n2)O(n^2)的。但容易發現每個環中都至少包含一個不大於V\sqrt V的素數,於是只需要枚舉不超過V\sqrt V的點爲起點bfs即可。

Codeforces 1325F Ehab’s Last Theorem

給出nn個點mm條邊的連通無向圖,設d=nd=\lceil\sqrt n\rceil,求一個有dd個點的獨立集,或是至少有dd個點的簡單環。
n105n\le 10^5

有兩種做法:
第一種是把dfs樹建出來,對於從下到上的每個點,若該點有小於d1d-1條返祖邊,則把該點加入獨立集,並把返祖邊連向的祖先刪掉。否則只要在其中找到深度最小的祖先,則這兩點之間構成一個滿足條件的環。
第二種是每次找度數最小的點,若該點度數小於d1d-1,則將其加入獨立集,並把與它有邊相連的點刪掉。若某個時刻所有點的度數都至少爲d1d-1,則容易構造出一個大小至少爲dd的環。

AtCoder Grand Contest 043 C - Giant Graph

有三個nn個點的簡單無向圖X,Y,ZX,Y,Z,構造一個有3n3n個點的無向圖,每個節點表示爲(x,y,z)(x,y,z),其中x,y,zx,y,z表示在X,Y,ZX,Y,Z中的點。兩個點(x1,y1,z1),(x2,y2,z2)(x_1,y_1,z_1),(x_2,y_2,z_2)之間有連邊當且僅當其中兩位相等,且另一維在原圖中對應的點有連邊。定義一個點的權值爲(1018)x+y+z(10^{18})^{x+y+z},求新圖的最大權獨立集。
n105,m105n\le 10^5,m\le 10^5

貪心地想,肯定是每次找一個權值最大的點,然後把這個點相鄰的點刪掉。設dp0[x,y,z]dp_0[x,y,z]表示(x,y,z)(x,y,z)這個點是否被選,轉移顯然。
再考慮這樣一個遊戲:在每個圖的某個節點上有一顆石子,每次可以將某個圖中的石子移到相鄰且標號比當前節點大的點上,不能操作者輸。設dp1[x,y,z]dp_{1}[x,y,z]表示當前狀態爲(x,y,z)(x,y,z)時選手是否會輸。
不難發現兩個dp數組的值相等。並且第二個dp數組的值刻意通過求出每個圖的sg函數值來得到。那麼只要分別求出每個圖的sg函數值,並求出所有異或值爲00方案的權值和即可。

AtCoder Grand Contest 043 D - Merge Triplets

問有多少個113n3n的排列可以被如下方式構造得到:有nn個長度爲33的序列,每次移除所有序列的第一個數中最小的那個並將其加入到排列末端,重複此過程3n3n次。
n2000n\le 2000

若有某一個數xx,它所在的序列中有一個比它大的數yy在它前面,那麼選了yy之後就會立刻選xx。這樣就可以把某個數和它後面的比它小的數合併成一塊。那麼最終的排列就是將每一塊按第一個數從小到大排序,然後首尾相接。這樣一個排列就跟一種分塊方案一一對應。
而一種分塊方案是合法的,當且僅當每個塊的大小不超過33,且大小爲11的塊不少於大小爲22的塊。假定分爲kk塊,大小分別爲a1,,aka_1,\cdots,a_k,則能構造出的排列數爲(3n)!a1(a1+a2)(a1++ak)\frac{(3n)!}{a_1*(a_1+a_2)*\cdots*(a_1+\cdots+a_k)}

這是因爲最後一塊的第一個數必須是3n3n,然後後面的ak1a_k-1個數可以任意選,不斷遞歸下去就得到了上述式子。
那麼就可以設dpi,jdp_{i,j}表示選了若干組的大小之和爲ii,大小爲11的塊數量減去大小爲22的塊數量等於jj的貢獻和。複雜度O(n2)O(n^2)

洛谷U107962 魔法

給出長度爲nn的序列aa,定義Fl,l=al,Fl,r=Fl+1,r+Fl,r1F_{l,l}=a_l,F_{l,r}=F_{l+1,r}+F_{l,r-1}。有qq次詢問,每次給出l,rl,r,詢問Fl,rF_{l,r}的值。
n,q2.5105n,q\le 2.5*10^5

可以發現Fl,r=i=lr(rlil)aiF_{l,r}=\sum_{i=l}^r\binom{r-l}{i-l}a_i

設塊的大小爲BBgi,j=Fi,i+Bjg_{i,j}=F_{i,i+B*j}。若令rl=kB+dr-l=k*B+d,則Fl,r=i=0d(di)gl+i,kF_{l,r}=\sum_{i=0}^d\binom{d}{i}g_{l+i,k}

考慮如何求gg。發現在rlr-l固定時,可以通過把aa數組翻轉後與(x+1)rl(x+1)^{r-l}進行卷積來求對應的FF,那麼就可以NTT預處理gg了。
時間複雜度O(nBnlogn+qB)O(\frac{n}{B}*n\log n+qB)

Codeforces 1334G Substring Search

給一個長度爲2626的排列pp和由小寫字母組成的串sstt,求tt的每一個長度爲s|s|的子串是否與ss匹配。設tt'tt的子串,則tt'ss匹配當且僅當ti=sit'_i=s_i或者ti=p[si]t'_i=p[s_i]1is1\le i\le |s|成立。這裏定義a=1,b=2'a'=1,'b'=2,如此類推。
st2105|s|\le |t|\le 2*10^5

設排列pp的某一個環上的元素依次爲c0,,ck1c_0,\cdots,c_{k-1},則令ss中對應字符爲cic_i的位置爲輻角爲2πik\frac{2\pi i}{k}模長爲11的複數,tt中對應字符爲cic_i的位置爲輻角爲π2πik\frac{\pi - 2\pi i}{k}模長爲11的複數。這樣若sstt兩個位置的字符可以匹配上,則它們對應複數的乘積爲輻角等於πk\frac{\pi}{k}πk-\frac{\pi}{k}的複數,滿足實部等於cosπk\cos\frac{\pi}{k},否則實部的值就會與cosπk\cos\frac{\pi}{k}有較大差距。因此我們只要把sstt對應的數字串卷積起來,就可以得到tt的每個子串的數字串和ss的數字串對應位相乘再相加的結果,再判斷與目標結果是否相等即可。
但不同環上的字符也可能被誤認爲匹配,這時需要先用kmp判一遍是否對應字符都在同一個環上即可。

Codeforces 1340F Nastya and CBS

有一個長度爲nn的括號序列,其中包含kk種不同的括號。每次修改一個位置的括號,或判斷一段區間是否是一個合法括號序。
n,q100000n,q\le 100000

定義如果一段區間是合法的,如果它在消去匹配的括號後變成一段右括號+一段左括號的形式。用線段樹維護每一段合法區間的右括號序列和左括號序列的哈希值。合併的時候,討論左區間的右括號序列和右區間的左括號序列的相對大小,然後再遞歸求出較長那一段的前綴或後綴哈希值。
時間複雜度O(nlog2n)O(n\log^2 n)

Codeforces 1342F Make It Ascending

給一個數組aa,每次操作可以選擇兩個數p,qp,q,令aq=ap+aqa_q=a_p+a_q,並把apa_p刪掉。問最少需要多少次操作把數組變爲單調遞增。
n15n\le 15

可以看成新數組中的一個數是由原來數組中的若干個數拼在一起形成的。設fi,j,maskf_{i,j,mask}表示用maskmask中的數,拼成了長度爲ii的遞增數組,其中第ii個數的位置在原數組的的位置jj上,第ii個數最小是多少。轉移的時候枚舉子集,然後對新的數貪心選擇儘量靠左的位置放置。
時間複雜度O(n23n)O(n^23^n)

Codeforces 1348F Phoenix and Memory

nn個人和nn個位置,每個人可以匹配的位置是一段區間,保證存在完美匹配,問完美匹配是否唯一。
n200000n\le 200000

先用貪心求出一個完美匹配:按編號從小到大確定每個位置匹配的區間,每次選取包含當前位置且還沒被選擇的區間中右端點編號最小的即可。
把人和位置看成有向二分圖,把匹配上的人和位置縮成一個點,則完美匹配唯一當且僅當縮點後的圖是一個DAG。用線段樹優化拓撲排序即可。

Codeforces 1349D Slime and Biscuits

nn個人,第ii個人有aia_i塊餅乾。每次從所有餅乾中隨機選擇一塊,並隨機交給除了該餅乾的主人以外的n1n-1個人中的其中一個。問所有餅乾都位於同一個人手裏所需的期望時間。
n105,ai3105n\le 10^5,\sum a_i\le 3*10^5

ExE_x表示結束時所有餅乾均位於第xx個人手裏的期望時間乘上對應概率的值,PxP_x表示結束時所有餅乾在第xx個人手裏的概率,ExE_x'表示從初始狀態到所有餅乾位於第xx個人手中的期望時間,CC表示從全部餅乾位於某個人手裏的狀態到全部位於另一個人手裏的狀態的期望時間。則有ans=i=1nEi,i=1nPi=1ans=\sum_{i=1}^nE_i,\quad \sum_{i=1}^nP_i=1

且不難得到關係式Ex=Ex+i=1n[ix](Ei+CPi)E_x=E_x'+\sum_{i=1}^n[ i\neq x](E_i+CP_i)

x=1,2,,nx=1,2,\cdots,n對應關係式的等號兩側求和,得到nans=i=1nEi+(n1)Cn*ans=\sum_{i=1}^nE_i'+(n-1)C

fif_i表示從某個人手裏有ii塊餅乾的狀態,到這個人手裏有i+1i+1塊餅乾的狀態的期望時間。遞推出ff後就可以求出EiE_i'CC

Atcoder NOMURA Programming Competition 2020 D - Urban Planning

nn個點的無向圖。每個點可以選擇除了它以外的一個點,表明這兩個點必須屬於同一個連通塊。現在有一些點的選擇已經固定,問其他點任意選擇的所有情況下,圖中最少存在的邊數之和。
n5000n\le 5000

如果把邊看成有向邊,那麼原圖已有的邊組成的弱連通塊,要麼是生成樹,要麼是生成樹加一個環,最終的圖的每個連通塊必然都是一個環套樹。可以轉化爲求每種方案中環的數量之和。圖中固定的環可以直接計數。若由大小爲A1,,AkA_1,\cdots,A_k的生成樹連通塊組成一個環,容易得出方案數爲A1Ak(k1)!A_1\cdots A_k(k-1)!,因此求出dpi,jdp_{i,j}表示前ii個連通塊中,選出jj個構成一個環的方案數之和即可。
時間複雜度O(n2)O(n^2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章