Nagisa

二维平面,给出三个个点的凸多边形,有次询问,每次给出一个点,问是否存在一个三个顶点分别在凸多边形里的三角形,使得三角形的重心是这个点。

计算几何 凸包 闵可夫斯基和

这题的重点是,我凸包求错了。有两个问题:

  • 分类讨论的时候没有讨论全,被 assert 打爆了。
  • 求凸包的时候如果按照排序,求上凸包是对的,求下凸包就不对了。虽然我也不懂为啥。

最好的策略似乎是只求上凸包,然后翻转一下再做一次。

Tomoya

给出一个个点条边有向有自环有重边无非自环的环的图,即一个 DAG 加上若干个自环。每条边有一个实数边权。要求你从走到。你每走到一个点(包括最开始的),这个点的出边(自环也算出边)的边权就会被等概率随机打乱,而你可以看到打乱后的结果,并决定走哪条边。你的目标是走过的边权和最小。

问最优策略的期望边权和,输出实数

期望

期望题的套路:设表示走到的期望。

没有自环

的后继分别是。记的出边边权分别为

如果没有自环,那么你会选择最小的走。对于的每个排列,我们要算的最小值。

由于只有个不同的值。考虑枚举这个最小值,那么我们要求剩下个的值都大于等于。那么把分别从小到大排序,相当于每个能选的是一段后缀。方案数是乘积的形式。

那么我们从小到大枚举的值,发现每次对乘积的影响是的。也就是说只有个数能选的范围发生改变。这样就可以计算期望。

有自环

如果有自环,那么我们就多了一个决策:走自环到。决策涉及到了自身,就不能简单地建立无后效性的转移关系,因此考虑建立等式。也就是说,意思是说我们以的概率走自环,代价为,然后再走这个期望,或者我们直接走出去,代价是

然而本题难点在于,该等式的系数表达难以得到。也就是说我们不知道这个等式长啥样。

考虑执行一个结果收敛的迭代过程。假设我已经求出了,那么我们可以建立怎样的等式?

这时一个精妙的思路来了:因为在逻辑上被视为常量,那么自环就可以变成普通边了!

如果个自环,那么我就把这个自环删掉,给新增个后继,新增后继的期望都设为。那么这就转化为没有自环的情况了。因此我们就可以用求出的期望了。

如果的精确值,那么用求出的就应该满足。否则,就与有误差。而这个误差是收敛的。也就是说我们不断地令然后再用求出新的,无限次后就可以得到的精确值。

直接迭代太慢。改成二分就行。

时间复杂度

Battle Lemmings

有一个长度为的 01 序列。每次你可以把一个和与它相邻的交换位置。定义一个序列的价值是满足以下条件的区间的个数:

  • 存在使得

现在对于,要求你求出在执行至多次操作的情况下,序列的价值的最大值。

将求最大价值转化为求最小代价。设由构成的极长连续段的长度的集合是,那么序列的代价可以描述为

表示考虑前,第的位置是,一共动了步的最小代价。

考虑转移,

不妨分类讨论。

Case 1

对于的情况,

固定,固定,那么

右边是一个只与有关的式子,那么

.

不妨设左边的是,与有关的部分是,设,那么

。这是让一条斜率为的直线过这个点,并最小化截距的问题。

注意到都是单调的,可以直接斜率优化。

计算的时候按照从小到大的顺序。固定,将 DP 状态按照的值分类(可以发现是一条一条斜线)。这样我们可以用单调队列维护凸壳,计算完同一类的 DP 状态。

Case 2

对于的情况,

固定,固定,那么

.

.

不妨设左边的是,与有关的部分是,设,那么

同样的方法,按照对状态分类即可。

代码