加载中...

7.5——1026F

1026F

一道很纯粹的思维+分类讨论,个人认为出得非常不错。

\[f(x, y) = (x\space mod\space y) + (y\space mod\space x) \]

问题可以转化为给定 \(y\)(对应\(b_{i}\)),\(x\) 可以取 \(b_{1到 i-1}\) 中的某个值,求 \(max(f(x, y))\)

我刚开始的思路是:对 \(f(x, y)\) 进行单调性分析(\(x\) 为变量,\(y\) 为常量):分 \(x < y\)\(x > y\) 两种情况讨论。而经打表发现 \(x < y\) 时单调性无任何规律,遂放弃这个想法,看看题解。

首先需要破解 \(f(x, y)\) 的三个重要性质:

  1. \(\forall x,y,且x<y\),均有:\(x <= f(x,y) <= y\)
    证:

\[ f(x, y) = x + (y\space mod\space x) = x + y - \lfloor \frac{y}{x} \rfloor * x \]

  • \(y\space mod\space x >= 0\) -> \(f(x, y) >= x\)
  • \(\lfloor \frac{y}{x} \rfloor >= 1\) -> \(f(x, y) <= y\)
  1. \(\forall i,j,且b_{i}<b_{j}\),若 \(f(b_{i},b_{j})\) 取最大值,则必有:\(b_{j} = b_{max}\)
    证:利用反证法:若 \(b_{j}\) 不是 \(b_{max}\),则一定 \(\exists b_{k} > b_{j}\)。那么由第一个结论:\(f(b_{i}, b_{j}) <= b_{j}\)\(f(b_{j}, b_{k}) >= b_{j}\) -> \(f(b_{i}, b_{j}) <= f(b_{j}, b_{k})\)。因此 \(b_{k}\) 一定是 \(b_{max}\)

  2. \(\forall i,j,且b_{i}<b_{j}\),若 \(b_{j} < 2b_{i}\),则有:\(\lfloor \frac{b_{i}}{b_{j}} \rfloor = 1\) -> \(f(b_{i}, b_{j}) = b_{j}\)

依据上述三个结论,可以进行以下分讨:令 \(b_{max} = b_{1到i-1}\),假设当前循环到 \(b_{i}\)

  1. \(b_{i} <= b_{max}\):则 \(b_{max}\) 不会发生改变。由结论2,只需要用 \(f(b_{max}, b_{i})\) 来更新当前答案即可。
  2. \(b_{max} < b_{i} < 2b_{max}\):结合结论1,3:\(f(b_{i}, b_{max}) = b_{i}\),为所有可行答案的最大值。则将答案直接更新为 \(b_{i}\) 即可。
  3. \(2b_{max}<=b_{i}\):由前缀最大值的非递减性,可知这种情况发生次数至多 \(log_{2}A\) 次,不会很多。因此遇到这种情况直接暴力更新即可,复杂度 \(O(nlogA)\)

具体实现见代码。

code

posted @ 2025-07-05 13:39  jxs123  阅读(8)  评论(0)    收藏  举报