朴素地构造
棋盘只有两行,路径完全由“在哪一列往下走”决定,记这个列为 \(k\),即
其中 \(U_k\) 是 \(k\) 右边上方剩下的和,\(L_k\) 是 \(k\) 左边下方剩下的和。
原策略等价于最小化剩下的总和
最终要使得:
- \(R\) 有唯一的最小值点 \(p\);
- 这个 \(p\) 不是 \(G\) 的最小值点(即存在别的路径让空拿得更少)。
左上角 \(a_{1,1}\) 和右下角 \(a_{2,n}\) 每条路径都会经过,对比较毫无影响,随便填。
记 \(x_i=a_{1, i+1}, y_{i}=a_{2, i}\),可如此表示相邻两条路径的 \(R\) 差:
所以“\(R_p\) 是唯一最小”等价于:
- 从 \(p\) 往左走,\(R\) 严格变大 \(\iff\) \(p\) 左边所有 \((x-y)\) 的后缀和都 \(>0\);
- 从 \(p\) 往右走,\(R\) 严格变大 \(\iff\) \(p\) 右边所有 \((y-x)\) 的前缀和都 \(>0\)。
假设白已经唯一选了 \(p\),显然 \(G\) 是单峰,那么最优解不是 \(p\) 等价于 “ \(G_{p+1}<G_p\) 或 \(G_{p-1}<G_p\) ” 。
构造解只需要考虑一边成立,另一边反过来再做一次即可。
右边要成立,只需要
接下来构造:
-
左边(\(i<p\))
为了让不等式右边尽量小,同时保证所有后缀和为正,直接取\[x_i=\text{上界},\quad y_i=\text{下界}。 \]令 \(e_i=\) 上界 \(x\) \(-\) 下界 \(y\)。
用一个简单递推\[s_i=e_i+\min(0,s_{i-1}) \]就能算出“所有以 \(i\) 结尾的后缀和的最小值”。只要 \(s_{p-1}\ge 1\),左边就合法。
-
中心 \(p\)
必须让 \(y_p-x_p=z\ge 1\),否则右边第一步 \(R\) 就不会严格上升。
同时还要保证右边所有前缀和条件能满足,所以 \(z\) 还要至少是 \(\text{need}_p+1\)(\(\text{need}_p\) 是右边 \(L\) 序列可能出现的最大前缀和)。
取满足所有下界的最小 \(z\),这样给右边留的余地最大。 -
右边(\(i>p\))
固定 \(y_i=\) 上界,令 \(w_i=x_i-y_i\)。
现在要在“所有前缀和 \(\le z-1\)”的约束下,最大化 \(\sum w\),这样才能让不等式左边尽量大。
这个最大值有闭式:\[\text{best}=\min\bigl(\text{全部取上界的和},\quad (z-1)+\text{某个后缀的上界和}\bigr)。 \]用后缀和 + 后缀最小值即可。
如果最终算出的左边最大值严格大于右边的最小值即有解。
找到合法的位置 \(p\) 后,就按上面判定时用的取法填:
- 左边直接取极值;
- 中心随便找一组满足差值 \(z\) 的 \((x_p,y_p)\);
- 右边固定 \(y=\) 上界,再构造满足前缀约束的 \(w\)(先算出每个前缀和能到达的区间,再从最终和倒推即可)。
如果右边找不到,就把整个 \(x,y\) 序列左右翻转,再用完全相同的算法找一次(对应原来的左边反例)。两边都失败就输出 \(-1\)。
整段过程全部是线性预处理 + 一次枚举 \(p\),总复杂度 \(O(n)\)。

浙公网安备 33010602011771号