Codeforces 1580
B Mathematics Curriculum
容易想到\(DP\)状态,\(dp[i][j][x]\)表示长度为\(i\)的排列中,有\(j\)个不同最大值的\(\text{good numbers}\)有\(x\)个的排列方案数。
一开始想用向其中插入元素的方法来转移,但实际上不可行。考虑枚举新排列的最大值位置,用合并的方法来转移,这样两边的所有数的不同最大值个数都\(+1\),总的\(\text{good numbers}\)个数也容易由两边合并而来。
\(dp[i][j][x]=\sum_{l=0}^{i-1} \binom{i - 1}{l - 1} \sum_{y = 0}^{x} dp[l][j-1][y]\times dp[i-l-1][j-1][x-y]\)
要特别注意边界情况,具体可以看代码。时间复杂度\(\mathcal O(n^5)\)。
Submission
C Train Maintenance
根号分治,想到了就不难了,实现上有些细节,具体看代码。
Submission
D Subsequence
观察题目所给的式子,进行化简
\(\sum_{i=1}^{m} m\cdot a_{b_i}-\sum_{i=1}^{m}\sum_{j=1}^{m}f(\min(b_i,b_j), \max(b_i,b_j))\)
\(=\sum_{i=1}^{m} (m-1)\cdot a_{b_i}-2\times \sum_{i=1}^{m}\sum_{j=i+1}^{m}f(b_i,b_j)\)
\(=\sum_{i=1}^{m}\sum_{j=i+1}^{m} a_{b_i}+a_{b_j}-2\times f(b_i,b_j)\)
由此发现和树上的点对距离十分相似,自然想到对原序列建立笛卡尔树,一条边的边权就是\(a_i-a_{fa_i}\),原题就转化为了求在树上选\(m\)个点两两之间距离和的最大值。
考虑树上背包,\(dp[x][i]\)表示\(x\)的子树内选了\(i\)个点,\(x\)子树内的边贡献和的最大值。\(dp[x][i+j]=dp[x][i]+dp[y][j]+w\cdot j\cdot (m-j)\),时间复杂度\(\mathcal O(n^2)\)。
Submission

浙公网安备 33010602011771号