2017CodeM初賽A場
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場