CF1918 E,F 题解
E:
一个复杂度需要随机化来保证的怪怪交互题。
题意:系统给出一个排列a,并随机出一个初始值now,每次你询问一个位置 i 。若 \(a_i<now\) ,则系统输出<,并使 now--;若 \(a_i>now\) ,则系统输出>,并使 now++;若 \(a_i=now\) ,则系统输出=,now 不变。(n<=2000)请在 40n 次询问内求出整个a序列。
Solution:
比赛时看到 “The interactor in this problem is not adaptive. ”,意识到自己的随机化想法应该可行。
这是一个类似于快速排序的思路,先随机一个位置 i,使得now等于 \(a_i\),然后询问其他数字,小于 \(a_i\) 的分一组,大于 \(a_i\) 的分一组,每询问一个数字就可以再询问初始数字使得now置回 \(a_i\) 。
分完组后我们发现:我们求出了\(a_i\) 的值(因为原数列为排列),我们将原数列划分成两个子问题,每个子问题长度期望为原来问题的一半。由于每个子问题内的数字都是连续的,因此now的移动距离会随着子问题的划分幅度越来越小。
我们继续在每个子问题内随机一个中间值,不断递归下去,期望层数是log,每个子问题大概需要扫描2n次区间,所以总询问次数大概是2nlogn,由于带着随机化,其实具体的复杂度不太会证明。
F:
题意:给你一棵树,你从根节点开始蚂蚁爬。你可以使用k次传送,瞬间传送到根,问爬完所有点的最小步数。
Solution:
可以使用0次传送的话,最终停留在深度最大的点,答案为 \(2*(n-1)-dep_{max}\) 。
现在可以使用传送了,我们考虑传送的影响怎么以数字化形式表现。如果我们在点x,下一个要到的点是y,如果不使用传送,花费就是x到y的距离,如果使用传送花费就变成y的深度。可见传送不见得更优。
我们现在需要定下一个访问的顺序。
思考我们什么时候会使用传送:如果在某棵子树中,我们确定了只使用一次传送,那么这次传送一定是在访问完这棵子树内所有点之后再传送,并且是在这棵子树的最深处的点传送节省的更多。
所以我们定下一个访问顺序:从深度较小的子树开始遍历,这样我们可以把每次要传送的情况包含在内。
我们求出欧拉序,可以在欧拉序上求出每次拜访新点的距离,和传送后走到新点的距离作差,选取节省最多的k次来传送。
总之就是妙妙题,会了就是会,不会就是不会。