WC 赛前训练日志 3
Nagisa
二维平面,给出三个个点的凸多边形,有次询问,每次给出一个点,问是否存在一个三个顶点分别在凸多边形里的三角形,使得三角形的重心是这个点。
。
计算几何 凸包 闵可夫斯基和
这题的重点是,我凸包求错了。有两个问题:
- 分类讨论的时候没有讨论全,被 assert 打爆了。
- 求凸包的时候如果按照排序,求上凸包是对的,求下凸包就不对了。虽然我也不懂为啥。
最好的策略似乎是只求上凸包,然后翻转一下再做一次。
Tomoya
给出一个个点条边有向有自环有重边无非自环的环的图,即一个 DAG 加上若干个自环。每条边有一个实数边权。要求你从走到。你每走到一个点(包括最开始的),这个点的出边(自环也算出边)的边权就会被等概率随机打乱,而你可以看到打乱后的结果,并决定走哪条边。你的目标是走过的边权和最小。
问最优策略的期望边权和,输出实数。
。
期望
期望题的套路:设表示走到的期望。
没有自环
记的后继分别是。记的出边边权分别为。
如果没有自环,那么你会选择最小的走。对于的每个排列,我们要算的最小值。
由于只有个不同的值。考虑枚举这个最小值,那么我们要求剩下个的值都大于等于。那么把和分别从小到大排序,相当于每个能选的是一段后缀。方案数是乘积的形式。
那么我们从小到大枚举的值,发现每次对乘积的影响是的。也就是说只有个数能选的范围发生改变。这样就可以计算期望。
有自环
如果有自环,那么我们就多了一个决策:走自环到。决策涉及到了自身,就不能简单地建立无后效性的转移关系,因此考虑建立等式。也就是说,意思是说我们以的概率走自环,代价为,然后再走这个期望,或者我们直接走出去,代价是。
然而本题难点在于,该等式的系数表达难以得到。也就是说我们不知道这个等式长啥样。
考虑执行一个结果收敛的迭代过程。假设我已经求出了,那么我们可以建立怎样的等式?
这时一个精妙的思路来了:因为在逻辑上被视为常量,那么自环就可以变成普通边了!
如果有个自环,那么我就把这个自环删掉,给新增个后继,新增后继的期望都设为。那么这就转化为没有自环的情况了。因此我们就可以用求出的期望了。
如果是的精确值,那么用求出的就应该满足。否则,就与有误差。而这个误差是收敛的。也就是说我们不断地令然后再用求出新的,无限次后就可以得到的精确值。
直接迭代太慢。改成二分就行。
时间复杂度。
Battle Lemmings
有一个长度为的 01 序列。每次你可以把一个和与它相邻的交换位置。定义一个序列的价值是满足以下条件的区间的个数:
- 。
- 存在使得。
现在对于,要求你求出在执行至多次操作的情况下,序列的价值的最大值。
。
将求最大价值转化为求最小代价。设由构成的极长连续段的长度的集合是,那么序列的代价可以描述为
表示考虑前个,第个的位置是,一共动了步的最小代价。
考虑转移,。
不妨分类讨论。
Case 1
对于的情况,。
固定,固定,那么
。
右边是一个只与和有关的式子,那么
.
不妨设左边的是,与有关的部分是,设,那么
。这是让一条斜率为的直线过这个点,并最小化截距的问题。
注意到和都是单调的,可以直接斜率优化。
计算的时候按照从小到大的顺序。固定,将 DP 状态按照的值分类(可以发现是一条一条斜线)。这样我们可以用单调队列维护凸壳,计算完同一类的 DP 状态。
Case 2
对于的情况,。
固定,固定,那么
.
.
不妨设左边的是,与有关的部分是,设,那么
。
同样的方法,按照对状态分类即可。
修订记录
- 2021年2月11日 第5次修订
- 2021年2月10日 第4次修订
- 2021年1月28日 第3次修订
- 2021年1月26日 第2次修订
- 2021年1月22日 创建文章