P3530[POI2012 FES-Festival] 题解
题面链接
简要题意
对于数列 \(\{v_n\}\),有两种约束 \(v_i=v_j+1\) 和 \(v_i\ge v_j\),问 \(\{v_n\}\) 最多有多少个不同的项。
解法
考虑先建图,注意到如果约束图是 DAG,那么我们按照拓扑序给每一个点赋充分大的权,则必然可以做到节点两两权值不等。于是考虑 tarjan 缩点,对于每个 SCC 分别计算,答案为所有 SCC 答案的总和。
对于一个 SCC,由于其强连通性,任意两个点之间都能找到对方的上下界,考虑钦定两个点 \(x,y\),让其点权 \(v_x,v_y\) 为所有点权中的最小和最大值,为了让不重复的点权数量最多,我们让 \(v_y=v_x+d(x,y)\),并让 \(x,y\) 遍历整个 SCC,则可以注意到 \(\max\limits_{x,y}\{v_y-v_x+1\}=\max\limits_{x,y}\{d(x,y)\}\) 是该 SCC 的答案的一个上界。容易证明,答案可以达到这个上界。
故最终答案为 \(\displaystyle\sum_{s\in SCC}\max_{x,y\in s}\{d(x,y)\}\)
总结
解决某些最优化问题时,如果从正面直接计算不可行,可以钦定最优解满足某些条件,简单地求出此时的答案,使得若最优解不满足该条件,则得到的答案劣于最优解,而不会干扰最终的答案,且必然可以枚举到最优解。
例如本题中某些 \(x,y\) 甚至不存在以他们为最小值和最大值的差分约束解,但是一定存在一对 \(x,y\) 是最终答案的最小值和最大值,而其他的 \(x,y\) 计算出的答案并不会大于最优解,所以最终可以得到正确的答案。