------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
宣?
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
直接看编程题。话不多说,上题面。
T1:手套配对
T2:美丽路径
T1
本题为数学题,但是直接去推式子还是有一定难度的。实际上可以瞪眼法先推一个“看起来比较正确”的式子。这个时候大概率会有问题,可以再用 dfs 打一张绝对正确的表(我用的是 n=5,m∈[1,10],k∈[1,5]n=5,m\in[1,10],k\in[1,5]n=5,m∈[1,10],k∈[1,5] 的表)。随后看看式子和表有什么区别(比如多乘了 222 的几次方,少了一项组合数之类的。)最后放出结论,答案为:
{(Cnk×Cn−km−2×k×2m−2×k) mod (109+7), m−2×k≥0;0, otherwise.\begin{cases} \left(C^k_n\times C^{m-2\times k}_{n-k}\times 2^{m-2\times k}\right)\bmod (10^9+7)&\text{,}\ m-2\times k\geq 0\text{;} \\ 0\quad&\text{, otherwise.} \end{cases}{(Cnk ×Cn−km−2×k ×2m−2×k)mod(109+7)0 , m−2×k≥0;, otherwise.
证明?好吧,我太菜了。
组合数和 222 的幂用递推公式预处理即可,数据范围再大组合数可以用模意义下的乘法逆元或者 Lucas 定理处理。时空复杂度 O(n2)O(n^2)O(n2)。
T2
显然本题为树形 dp。按照树形 dp 的套路,我们令根为 111,ans(i)ans(i)ans(i) 为以 xxx 为根的子树中的最长美丽路径长度,dp(i)dp(i)dp(i) 为以 xxx 为根的子树且路径的一端为 xxx 的最长美丽路径长度,则答案为 ans(1)ans(1)ans(1)。容易得到转移方程:
dp(x)={1, sonx=∅;maxy∈sonxandc(x)≠c(y){dp(y)+1}, otherwise.dp(x)=\begin{cases} 1 & \text{,}\ son_x=\varnothing\text{;} \\ \max\limits_{y\in son_x\operatorname{and}c(x)\neq c(y)}\{dp(y)+1\} \quad &\text{, otherwise.} \end{cases}dp(x)=⎩⎨⎧ 1y∈sonx andc(x)=c(y)max {dp(y)+1} , sonx =∅;, otherwise.
ans(x)={1, sonx=∅;max{maxy∈sonx{ans(y)},maxlen+seclen+1}, otherwise.ans(x)=\begin{cases} 1 & \text{,}\ son_x=\varnothing\text{;} \\ \max\{\max\limits_{y\in son_x}\{ans(y)\},maxlen+seclen+1\} \quad &\text{, otherwise.} \end{cases}ans(x)={1max{y∈sonx max {ans(y)},maxlen+seclen+1} , sonx
=∅;, otherwise.
其中 maxlen,seclenmaxlen,seclenmaxlen,seclen 分别为异色儿子 yyy 中 dp(y)dp(y)dp(y) 的(非严格)最大、次大值。
翻译:若节点 xxx 为叶子节点,则 dp(x)=ans(x)=1dp(x)=ans(x)=1dp(x)=ans(x)=1;否则 dp(x)dp(x)dp(x) 为其所有异色子节点 yyy 中最大的 dp(y)+1dp(y)+1dp(y)+1,ans(x)ans(x)ans(x) 为其所有子节点 yyy 中最大的 ans(y)ans(y)ans(y),再与其所有异色子节点 yyy 中 dp(y)dp(y)dp(y) 的(非严格)最大、次大值之和加一取最大值。
用 dfs 转移,时间复杂度 O(n)O(n)O(n)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
后记
估分 90pts90pts90pts 以上嘿嘿。