1. 程式人生 > >Noip模擬2 2018/10/18

Noip模擬2 2018/10/18

T1:Matrix
小z 的女朋友送給小z 一個 n × n n×n 的矩陣。但是矩陣實在太大了,小z 的女朋友拿不動,只能帶給他兩個長度為n 的整數序列l,t,分別作為矩陣F的第一行和第一列(保證 l

1 = t 1 l1=t1 ),並且告訴小z 矩陣可以通過如下方式得到: F (
i , j ) = a F ( i
, j 1 ) + b F ( i 1 , j ) F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)

現在小z 猜到了係數a,b,他想要計算 F ( n , n ) F(n,n) 1 0 9 + 7 10^9+7 的值。

忽然想不起從 ( 0 , 0 ) (0,0) ( n , m ) (n,m) 的路徑數了,陣列開小……
對於一個 l [ i ] l[i] ,通過大力推式子可以發現一定會乘上 a n 1 b n i a^{n-1}*b^{n-i}
對於 t [ i ] t[i] ,則一定會乘上 a n i b n 1 a^{n-i}*b^{n-1}
然後考慮對於每一個值,會對答案造成多少貢獻
可以發現,每一個值的貢獻次數就是這個位置到 ( n , n ) (n,n) 的路徑數
以該位置為起點,那麼就是從 ( 0 , 0 ) (0,0) ( n 1 , n i ) (n-1,n-i) ,但是第一步是固定的
那麼就成了從 ( 0 , 0 ) (0,0) ( n 1 , n i 1 ) (n-1,n-i-1)
類似螞蟻路徑,方案數為 C ( 2 n i 2 , n 2 ) C(2*n-i-2,n-2) 即為對答案的貢獻次數

T2:pq
小q 的女朋友送給小q n個整數。但是這些數太大了,小q 的女朋友拿不動,於是拜託小q把這些數減少一些。
小q 每次可以選擇其中的兩個x,y (不能同時選擇同一個數) 變成x−P,y−Q,現在他希望能知道最多能幫女朋友減掉多少P,Q。

f [ i ] [ j ] [ k ] f[i][j][k] 表示處理到第 i i 個數,還有 j j P P k k Q Q 沒處理,存的是已經處理的個數
可以發現,如果 P P 的個數為 0 0 ,那麼 Q Q 的個數的最大值不會超過 2000 2000
如果 Q Q 的個數為 0 0 ,那麼 P P 的個數的最大值不會超過 2000 2000
如果都不為零,那麼 P , Q P,Q 的個數都不會超過 40 40
根據這個性質,我們可以暴力把 s [ i ] s[i] 拆成 x x P P y y Q Q
分類討論 x x j j y y i i 的大小,然後統計答案
但是陣列 50 2000 2000 50*2000*2000 會炸,因為每一次只會有 i 1 i-1 對答案造成貢獻,可以把i滾動掉
時間效率 O ( n ( 2000 + 2000 + 4 0 2 ) 50 ) O(n*(2000+2000+40^2)*50)

T3:graph
小f 的女朋友送給小f 一個有n個點m條邊的無向圖。但是這個無向圖太大了,小f 的女朋友拿不動,於是小f 希望只保留圖的一部分。在這張圖上,對於第i條邊 u i , v i ui,vi ,從 u i ui v i vi 的代價為 a i ai ,從 v i vi u i ui 的代價為 b i bi
小f 希望只保留一個包含1號點的有向環(不能有重複的點),使得環上代價之和最小。

因為環中一定有節點 1 1 ,那麼就從1開始大力DFS,陣列開夠有 65 65 %
那麼我們可以把 1 1 拆成 2 2 個點,暴力列舉環上與 1 1 相連的兩點,取最小值,效率為 O ( n 3 log n ) O(n^3 \log n) 25 25 %
然後考慮優化
我們可以把與 1 1 相連的點分成兩部分,然後跑最短路,但是有可能最短的兩個點在一個集合中,考慮優秀的分組方式
考慮按位分組,可以保證對於任意的 V i ! = U i Vi!=Ui 都一定會有一次分在不同的兩組,需要分成 ( l o g n ) (log n) 組,然後統計最小值即可
時間效率 O ( n log n 2 ) O(n \log n^2)