2019 08 12 省選組 模擬

2021-09-26 04:32:42 字數 1091 閱讀 5503

t1:這題的題意有點難懂。其實題目就是要我們先讓所有工人把該學的都學了,然後使得無論工人們在那種選擇的情況下都可以讓所有機器都有人操作。

推一推不難發現:我們把整個二分圖分成若干個連通塊,所有機器都有人操作的充要條件就是每乙個連通塊都是乙個完全二分圖(即左邊的每乙個點向右邊的每乙個點都有連邊)。

那麼我們先把一開始的連通塊都處理出來,設第i個連通塊左邊有x[i]個點,右邊有y[i]個點,現在問題就轉換成了要把這些連通塊組合起來,使得每乙個大的連通塊左右點數相等,而最終答案=sum(s^2)最小。s表示每乙個大連通塊的左邊的點數。這個很顯然,因為sum(s^2)就是總的要連的的邊數,用它減去一開始就有的邊數就是答案。

那麼現在問題就轉換成了求最小的sum(s^2)。這個可以狀壓dp。設f[s][i]表示當前已選的連通塊狀態為s,最後乙個還未選完的連通塊集合目前x的和為i。那麼我們列舉下乙個要選的連通塊(假設是k),於是我們便有兩種轉移方式:

1、f[s][i]->f[s+2^(k-1)][i+x[k]]

2、f[s][i]->f[s+2^(k-1)][0]

第1個很好理解,而第2個表示的是當前選完k之後我們就又完成了乙個連通塊集合。但是問題是我們怎樣判斷這個連通塊集合是否合法(即sum(x)==sum(y))。這個其實很簡單,我們只需要判斷一下s+2^(k-1)這個集合中sum(x)是否等於sum(y)就可以了。可能有人會問這只是總的和,而不是當前連通塊的和,但是我們注意到每一次完成乙個連通塊時都判斷一次,所以總的一定是對的。

t2:首先我們注意到那條式子的計算只與(x[i]-x[j])、(y[i]-y[j])和(z[i]-z[j])有關,而x、y、z都在77以內,所以它們的差的範圍只有155。我們設cnt[xx][yy][zz]表示差分別為xx、yy、zz的組合的出現次數,只要求出這個我們就可以求答案了。

那麼現在我們來求cnt。這個可以用ntt做。對於乙個x[i],我們將a陣列中x[i]項和b陣列中的77-x[i]項的係數都加1。那麼對於一對x[i]和x[j],當a和b相乘時,a中的x[i]項與b中的77-x[j]項組合在一起就是x[i]-x[j]+77,那麼這樣我們就求出cnt了。

總結:當我們要求乙個集合與另乙個集合的元素兩兩組合出來的結果時,可以考慮fft或ntt。

t3:題解待更新。

2020 01 16 省選組 模擬

這套比賽目前只改出一題。t1 首先我們發現對於k個關鍵點構成的一棵樹,最有答案一定是2 sum maxdis,其中sum表示所有邊權的和,maxdis表示直徑的長度。知道了這個之後我們就可以分兩部分算答案。首先計算sum。我們列舉每一條邊,然後計算這一條邊可能出現在關鍵樹上的方案數。設這條邊的一側有...

2020 06 06 省選A組 模擬

t1 首先這題可以通過推式子 考慮相鄰兩個位置的優劣情況 發現最優解應該是按照a t從大到小的順序來解題的。所以我們可以求出最優解的序列,現在要求的就是c的最大值。但這時我們會發現可能會有多個a t相同的點,所以我們求出每一道題可能出現的最早和最晚的時間,這兩個時間就等於這個點在a t相同的這一塊中...

2020 09 05 省選組 模擬

t1 首先用tarjan求出所有的點雙,然後建圓方樹。具體的建法是將當前點雙的割點作為父親向乙個新建的方點連邊,然後方點在想點雙中其他點連邊。在建好圓方樹之後我們就樹形dp。設f i 表示從i的子樹到i的最長鏈的長度。對於每個x,如果x為圓點則像常規一樣轉移 若x為方點則要處理一下 把當前方點對應的...