1. 程式人生 > >2017CodeM初賽A場

2017CodeM初賽A場

枚舉 意思 取出 顏色 轉換 das 格子 n) 二分圖染色

A、最長樹鏈(loj6159)

分析:

對於每個質因數,取出所有是它倍數的點組成一個樹,然後找最長路徑

每個數操作次數是其質因數的個數

所以總的復雜度不超過O(nlogA)

B、二分圖染色(loj6160)

分析:

先轉換模型——一個n*n的棋盤上,對於每個格子,可以下黑子,可以下白子,可以不下子,要求同一行同一列顏色相同的棋子最多只有一個

考慮黑白兩種顏色不太好考慮,我們去考慮單個顏色

設An表示n*n的棋盤上,放若幹個棋子,同一行同一列最多只有一個棋子的方案數

那麽有An=ΣC(n,i)*P(n,i) (枚舉哪些行放棋子,然後這些行棋子的列做排列)

再考慮兩種顏色,我們把兩個棋盤拼起來,發現矛盾點就是不能有格子既有黑子又有白子

那麽想到容斥:An*An- 至少有一個格子重疊 + 至少有兩個格子重疊 - 至少有三個格子重疊……

對於重疊怎麽計算呢?一個格子如果重疊了,那麽這個格子所在行列都不能放其它棋子了,所以這行這列相當於刪去了

所以至少有i個格子重疊可以表示成:C(n,i)*P(n,i)*A(n-i)*A(n-i)

看一下時間復雜度,題目要求在線性時間內完成,求An就成為了一個問題

其實An可以遞推求得:An=2nA(n-1)-(n-1)*(n-1)*A(n-2) (留個坑,暫時不太弄懂啥意思?)

C、倒水(loj6161)

分析:

容易發現當大水缸裏水的容量介於水杯水之間的時候,一定是無解的

只有在兩邊才有解

如果在左邊,那麽答案一定是最小的那個;如果在右邊,那麽可以二分

D、身體訓練(loj6162)

分析:

期望式子推一推就出來了

E、合並回文子串(loj6163)

分析:

考慮dp

dp[i][j][k][l]表示a[i..j]和b[k..l]結合能否成為一個回文串

那麽顯然一共有4種轉移

註意下初值就行了

F、數列互質(loj6164)

分析:

第一想法肯定就是莫隊,也容易想到記錄當前區間每個數出現次數以及“出現次數”的出現次數

那麽時間復雜度就是O(nsqrt(n)+m*MAX*logA)

其中MAX是出現次數的最大值,logA是求gcd的時間

如果MAX是根號級別的就好了,但明顯此題中MAX會很大,那麽怎麽辦呢?

我們可以先做一個這樣的處理:挑出所有在數組中出現次數>=sqrt(n)的數字,把這些數字用一個桶一刷,求個前綴和,然後遍歷所有詢問,算這個數字對每個詢問的貢獻

因為出現次數>=sqrt(n)的數字個數肯定不會超過sqrt(n)個,所以這個的時間復雜度就是O(sqrt(n)*m)

然後對於那些出現次數<sqrt(n)的數字進行莫隊,那麽MAX就是sqrt(n)了

所以整個復雜度就是O(nsqrt(n)+msqrt(n)+m*sqrt(n)*logA)

2017CodeM初賽A場