LuoGu/CodeForces.
没有简述题意。
试图平凡地设\(dp_{u,i}\)表示以\(u\)为根子树内划分了\(i\)个集合,然而由于要维护MEX在根处难以转移。我们可能需要根所在路径的信息。重设状态:\(dp_{u,i}\)表示以\(u\)为根的子树内,钦定\(u\)所在的向外延伸的路径中\(i\)未出现,除这条路径外的MEX和。我们可以认为这条路径的MEX就是\(i\),因为如果不是,MEX一定比\(i\)小,这个状态就不优秀,优秀的也一定会被统计到。
下面讨论转移。
- \(u\)为叶子。\[dp_{u,i}=\begin{cases} 0 & i\not=a_u\\ +\infty & i=a_u \end{cases} \]
- \(u\)有一个儿子\(v\)。\[dp_{u,i}=\begin{cases} \min dp_{v,i},\min_{j\not= a_u}dp_{v,j}+j & i\not=a_u\\ +\infty & i=a_u \end{cases} \]意思是接上\(v\)的路径,或让\(v\)的路径在\(u\)结束,意思累计贡献,然后\(u\)再开一条。
- \(u\)有两个儿子\(x\),\(y\)。
 记\(k_1=\min_{i\not=a_u}(dp_{y,i}+i)\),\(k_2=\min_{i\not=a_u}(dp_{y,i}+i)\)
 记\(k=\min_{i\not=a_u} dp_{x,i}+dp_{y,i}+i,k_1+k_2\)。\[ dp_{u,i}=\begin{cases} \min\{dp_{x,i}+k_2,dp_{y,i}+k_1,k\} & i\not=a_u\\ +\infty & i=a_u \end{cases} \]意思是接上\(x\)的路径,或接上\(y\)的路径,或合并\(x\),\(y\)的路径然后新开,或让\(x\),\(y\)的都结束然后新开。
由于MEX不会超过\(n+1\),复杂度为\(O(n^2)\),无法接受。事实上,可以证明的是,本题中路径MEX的范围不超过\(O(\cfrac{n}{\ln n})\),并且当\(n=25000\)时,只需枚举到\(3863\),这样复杂度到了\(9e7\)级别,可以跑过。
简单证明一下。
考虑一条最优集合中的路径\(a,b,c,d,e...\),对于其中的某个数字\(x\),以此将路径分割成形如:
对于未出现\(x\)的段,其MEX不超过\(x\),对于出现\(x\)的段,其MEX不超过\(4\)(若\(x\)大于等于\(4\)则MEX不超过\(3\))。设整段路径MEX为\(t\),权值\(i\)出现次数为\(c_i\),则有:
由此,\(i\)的出现次数\(c_i\)为\(O(\cfrac{t}{i})\)级别, \(n=\sum c_i=t\ln t\),故\(t\)为\(O(\cfrac{n}{\ln n})\)级别。
同时,我们还有\(n=\sum c_i\ge\sum_{1\le i\le 3}\lceil\cfrac{t}{i+4}\rceil+\sum_{i\ge 4}\lceil\cfrac{t}{i+3}\rceil\),当\(n=25000\)时,二分出\(t\)不超过\(3863\)。
Code.