Educational Codeforces Round 158 (Rated for Div. 2)

发布时间 2023-11-26 20:09:33作者: xzm111

A - Line Trip

最后一段需要往返。

\[ans = \max(\max\limits_{i=1}^{n} a_i-a_{i-1},2(x-a_n)) \]

Submission

B - Chip and Ribbon

相当于问:每次给一个区间减一,最少需要选择多少个区间使得所有数变成 \(0\)。考虑差分,区间减一相当于给差分数组一个位置减一,一个位置加一,于是答案即为差分数组中正数的和和负数的绝对值的和之间的较大值(这里因为 \(c_1 > 0\)\(\forall i: c_i \ge 0\),所以一定取到正数的和)。

第一个区间不用传送,于是需要减一。

Submission

C - Add, Divide and Floors

二进制下考虑这个操作,相当于给所有数同时加上一个 \(x\) 之后,不断尝试右移一位直到所有数相同。于是枚举右移的位数,两个二进制前 \(k\) 位不同的数能在加上一个 \(x\) 后相同,当且仅当它们二进制前 \(k\) 位的差为 \(1\),且存在一个 \(x\) 使得较小值加上后在第 \(k\) 位进位而较大数加上后不会。

于是枚举右移的位数,每次对最大值和最小值考虑是否能把它们搞成一样的即可。

Submission

D - Yet Another Monster Fight

若选择 \(i\) 处释放技能,则最坏情况下,\(i\) 左边的 \(j\) 受到的伤害为 \(x-(n-i)-(i-j) = x - n + j\)\(i\) 右边的 \(j\) 受到的伤害为 \(x-(i-1)-(j-i) = x-j+1\)。于是可以得出限制 \(\forall j < i: x-n+j \ge a_j, \forall j > i: x-j+1 \ge a_j\),即 \(\forall j < i: x \ge a_j+n-j, \forall j > i: x \ge a_j+j-1\) 预处理 \(a_j+n-j\)\(a_j+j-1\) 前后缀最大值后,枚举 \(i\) 找最小的 \(x\) 即可。

Submission

E - Compressed Tree

\(dp_{u,i}\) 表示保留 \(u\) 并考虑了 \(u\) 的子树,假设 \(u\) 与父亲有边时,\(u\) 的子树保留恰好 \(i\) 个时的答案。

先不考虑 \(u\) 自己的权值,则合并 \(u\) 的子树相当于一个背包:\(dp_{u,i+j} \leftarrow \max(dp_{u,i+j},dp_{u,i}+dp_{v,j})\),不是多重背包,要注意枚举顺序或把 \(dp_u\) 原本的值复制出来转移。

合并完成后加入 \(u\) 的权值,由于假定 \(u\) 到父亲有边,于是 \(i=1\)\(u\) 会被压缩掉,其余情况 \(u\) 会被保留,于是除了 \(dp_{u,1}\) 都需要加上 \(a_u\)

注意到 \(i \ge 3\) 的状态本质相同,于是全部放到 \(i=3\) 处一起转移 。

任取一点为根做这个 dp,答案即为每个点的 \(\max\{dp{u,0},dp_{u,1}+a_u,dp_{u,2}-a_{u},dp_{u,3}\}\),其中取到 \(u\) 点的 \(dp\) 表示了不选 \(u\) 向父亲方向的子树。

Submission

F - Landscaping

由于要把所有点包含在直线以下,于是这条直线一定在这些点构成的上凸壳之外。而要求面积最小,则这条直线一定和凸壳有交点。

注意到当交点的横坐标 \(x < \dfrac{n}{2}\) 时,左边的宽更小,于是顺时针旋转会使面积减小,同理,当 \(x > \dfrac{n}{2}\) 时,逆时针旋转会使得面积减小。不断调整发现,直线一定是凸壳上与直线 \(x = \dfrac{n}{2}\) 相交的那一条或两条线段所在的直线。要求的答案是 \(y_0 + y_1\),若令凸壳和直线 \(x = \dfrac{n}{2}\) 的交点为 \((x',y')\),由于直线过 \((x',y')\) 则有 \(2 y' = y_0 + y_1\),于是对于每种修改后的情况,求出凸壳和直线 \(x = \dfrac{n}{2}\) 的交点的纵坐标即可。

于是可以从直线 \(x = \dfrac{n}{2}\) 处把点分成两半,对于左边的答案,先求出右边的凸壳,然后对于左边的每个点,求出它和右边凸壳的切线与直线 \(x = \dfrac{n}{2}\) 的交点,显然所有交点纵坐标的最大值就是最终凸壳和直线 \(x = \dfrac{n}{2}\) 交点的纵坐标。对于修改,则维护 \(a,b\) 中的点对应的交点纵坐标的前后缀最大值,枚举修改到哪个位置合并前后缀即可。右边的答案直接把 \(a,b\) 互换然后反转再做一遍就行。

Submission