CF1359 简要题解
无言投下(指摸了)。
- A
显然让某个人尽可能多拿,剩下的尽可能平均分配最优。
- B
每一行是独立的。设 \(f_i\) 表示填满前 \(i\) 个位置所需的代价,根据 \(s_i\) 和 \(s_{i-1}\) 的情况,可以决定是否从 \(f_{i-1}\) 和 \(f_{i-2}\) 转移。
- C
可以发现,如果倒了偶数次,那么平均温度必然是 \(\frac{c+h}{2}\),因此只可能倒了 \(2\) 杯。
现在只考虑倒了 \(2x-1\) 次的情况,即 \(x\) 次热水,\(x-1\) 次凉水,此时温度为 \(f(x)=\frac{xh+(x-1)c}{2x-1}\)。感性理解或者稍微推一下式子就可以发现,\(f(x)\) 是单调减的,且当 \(x\rightarrow +\infty\) 时,\(f(x)\rightarrow \frac{c+h}{2}\)。
因此,如果 \(t\leq \frac{c+h}{2}\),那么一定是倒 \(2\) 杯,否则,要使 \(f(x)\) 尽可能接近 \(t\) 的话,只需要找到最小的 \(x\),使得 \(f(x)\geq t\),答案取 \(x\) 和 \(x+1\) 中较优的一个即可。这个过程可以二分,也可以由 \(\frac{xh+(x-1)c}{2x-1}\geq t\) 和 \(t>\frac{c+h}{2}\) 推出 \(x\geq \frac{c-t}{h+c-2t}\),直接算即可。
- D
不难发现,对于任意选定的区间 \([l, r]\),对方都会移除区间内最大的元素。不妨设相同元素中左边的更大,那么如果被移除的位置是 \(x\),对应的被选中的区间 \([l, r]\) 应满足 \(\max_{i=l}^{x-1} a_i<x, \max_{i=x+1}^r a_i\leq x\)。双指针一波,很容易就能找到每个位置可能的最大区间 \([l', r']\),每个以 \(x\) 作为区间最大值的区间都是 \([l', r']\) 的子区间。
于是就很简单了,只需要对每个 \((x, l', r')\),求出 \([l'-1, x-1]\) 内,令 \(\sum_{i=1}^k a_i\) 最小的 \(k\),左侧的答案就是 \(\sum_{i=1}^{x-1} a_i-\sum_{i=1}^k a_i\),右侧同理。这个最小值可以用线段树简单维护。
- E
设 \(a<b\),则 \(x\bmod a\bmod b=x\bmod a\)。若 \(x\bmod a\bmod b=x\bmod b\bmod a\),则 \((x\bmod b)\bmod a=x\bmod a\),即 \(x\equiv x\bmod b \pmod a\)。注意到 \(x\bmod b=x-\lfloor\frac{x}{b}\rfloor \cdot b\),上式等价于 \(x\equiv x-\lfloor\frac{x}{b}\rfloor \cdot b\pmod a\),即 \(\lfloor\frac{x}{b}\rfloor \cdot b\equiv 0\pmod a\)。由于 \(x\) 是任意选取的,想要对任意的 \(x\),这个式子都成立,只有 \(b\equiv 0\pmod a\),即 \(a|b\)。对于原题,不难发现题目中的要求,必要条件是 \(\forall i\in [1, n], a_1|a_i\),并且它的充分性显然。因此,只需要枚举 \(a_1\),剩余的 \(a_i\) 共有 \(\binom{\lfloor\frac{n}{a_1}\rfloor-1}{k-1}\) 种方案。
- F
这题思路其实非常经典,但是代码过于精污所以……
首先,二分答案之后转化为判定是否有两条线段相交,而这个问题可以在 \(O(n\log n)\) 的时间内解决。
将所有端点按照横坐标排序,这样每个时刻的操作就形如添加或删除一个一次函数。注意到,假如我们按照当前(指 \(x=x_0\))的 \(y\) 值排序后,如果任意两条排序后相邻的线段之间都不相交,那么在下一个插入或删除操作前,任意两条线段都不会相交,并且任意两条线段之间的 \(y\) 值的大小关系都不会改变。因此,只需要用一个 set
维护当前所有的线段(注意排序的关键字是将 \(x=x_0\) 代入后的 \(y\) 值,由于在未找到交点时,它的大小顺序不会改变,这里的关键字设置是合法的),每次插入、删除操作时,判断 “新成为相邻” 的两条线段是否相交即可。
但是还存在一些代码上的难点。首先是如何判断两条线段是否有交。如果它们平行,那么只有截距相同且长度足够才可以。否则,可以把它们当作直线,求出交点后再判断交点到线段端点的距离。交点求法很容易在网上找到,这里不再赘述。另外一个问题是,在线段数量很少时,答案可能会非常大,二分起来会很麻烦。一个解决方案是在 \(n\) 较小时暴力求 \(\binom{n}{2}\) 对射线相交的最短时间。