CF 1253 题解
A Single Push
考虑令 \(d_i=b_i-a_i\), 那么合法当且仅当 \(d\) 在一个前缀和一个后缀都是 \(0\), 其余地方值一致并且非负.
B Silly Mistake
注意到能作一次划分的时候立即划分一定更优, 因为这样就不会因为潜在的一天两次进入办公室而得不到答案.
贪心的模拟即可.
C Sweets Eating
首先把 \(a\) 降序排列, 用手去玩前几个值, 注意找递推关系: (令 \(k = 2\))
观察得 \(f_i=sum_i+f_{i-k}\), 递推即可.
D Harmonious Graph
考虑一个边 \(l\rightarrow r\), 那么意味着 \(l\) 到 \(r\) 这个区间都联通. 维护这样的连通性只需要并查集, 顺便用并查集跳过已经合并的位置, 那么暴力做就是对的.
需要添加的边就是目前的连通块数减掉最终连通块数, 证明考虑每一条边合并两个连通块.
E Antenna Coverage
注意到 \(n\) 比较小, 那么考虑一个 \(O(nm)\) 的 dp, 设 \(f_i\) 表示用第 \(i\) 格之前的信标去覆盖前 \(i\) 个位置的最小代价, 枚举覆盖第 \(i\) 格所用的信标 \(j\), 计算刚好覆盖 \(i\) 时该信标所覆盖的左端点 \(l\), 然后转移 \(f_i\leftarrow cst+\min_{l\leq j<i}f_j\), 后半部分在单调栈上二分即可.
问题是最后面的信标可能在右侧覆盖范围超出了 \(m\), 但是注意到它一定不会超过 \(2m\), 那么计算到 \(2m\) 即可.
F Cheap Robot
这道题是很牛的. 首先考虑求出来每个点离它最近的充电站的距离 \(dis_i\), 以及该充电站编号 \(near_i\). 暴力做直接炸了, 但是考虑多源 dij 就可以了.
考虑列列式子, 对于一条边 \(u\rightarrow v : w\), 设经过 \(i\) 时电量为 \(c_i\), 答案为 \(x\), 由于任意充电桩到达它都需要 \(dis_i\) 代价, 而它到达任意充电桩都需要 \(dis_i\) 代价, 因此有:
我们不妨认为机器人从 \(u\) 走到了 \(v\), 那么:
那么不难发现:
移项, 得:
我们现在有答案的一个下界, 考虑现在有路径 \(P:u\rightarrow v\), 而现在令答案是 \(\max_{(u,v):w\in P}(dis_u + dis_v + w)\), 是否存在合法路径呢? 存在的, 设路径表示为 \(p_1\rightarrow p_2\rightarrow p_3\rightarrow \ldots\rightarrow p_{k-1}\rightarrow p_k\), 那么我有足够的电量从 \(p_1\) 走到 \(near_{p_2}\), 再从 \(near_{p_2}\) 走到 \(near_{p_3}\), 以此类推即可.
因此把每条边重新赋边权, 然后建立最小生成树, 倍增求链上最大值即可.