#919. 【UR #28】环环相扣 题解
取模不好搞,我们先分析性质。
首先可以假设 \(a_i>a_j>a_k\),那么根据“环的顺序”,可以被分成两种情况
-
\(i\to j\to k\to i:(a_i\bmod a_j)+(a_j\bmod a_k)+a_k\)
-
\(i\to k\to j \to i:(a_i\bmod a_k)+a_j+a_k\)
最优化的题,我们可以先分析一个答案下界/上界,与他们的取等条件,这样往往可以找到许多优秀的性质。
分析答案下界是很简单的,就是竭尽所想的构造一个比较优的方案。
分析答案上界需要一些数学手段,得到一种情况的答案上界,若小于等于先前分析的答案下届,那么这种情况就一定是不可取的。
由于取模很复杂,这里直接不考虑取模都可以得到一个答案下界:
考虑第二种情况,有 \(ans\ge a_{\max_2}+a_{\max_3}\),即次大值加次次大值。
根据取模的常见结论:
当 \(a>b\) 时 \(a\bmod b\le \min(b-1,\frac a2,a-b)\)。
得到两种情况的上界:
- \(ans\le \min(a_j+2a_k-2,\frac {a_i}2+\frac {a_j}2+a_k,a_i,2a_j-1,\cdots)\)
- \(ans\le \min(a_j+2a_k-1,\frac {a_i}2+a_j+a_k,a_i+a_j)\)
当然对于情况一还有更多的组合,但是形式十分复杂看上去就不怎么好分析。
我们尝试从形式最简单的那几个探究起。
-
对于第一种情况:
-
\(ans\le a_i\) 这说明当 \(i\) 不取最大值就一定使第一种情况答案达不到上界
-
\(ans\le 2a_j-1\) 这说明 \(a_j\) 只能取次大值(因为 \(a_i\) 是最大值)否则会使答案低于下界
-
\(ans\le \min(a_j+2a_k-2,a_i-a_j+2a_k-1,\cdots)\) 太复杂了,有加减乘除还涉及多个变量,似乎并不能分析出什么。
-
-
对于第二种情况:
- \(ans\le a_i+a_j\):这说明若 \(a_i\) 只能取最大值,否则答案不会更大。
- 其他情况同理,太复杂了。
现在根据我们的分析重新整理一下两种情况:
-
\(ans=(a_{\max}\bmod a_{\max_2})+(a_{\max_2}\bmod a_k)+a_k\)
-
\(ans=(a_{\max}\bmod a_k)+a_j+a_k\)
可以发现第二种情况 \(a_j\) 不参与任何取模,直接取次大值一定是最优的(之前要求比 \(a_i\) 小,不能贸然得到这个结论)。
于是再次整理为:
-
\(ans=(a_{\max}\bmod a_{\max_2})+(a_{\max_2}\bmod a_k)+a_k\)
-
\(ans=(a_{\max}\bmod a_k)+a_{\max_2}+a_k\)
于是只有 \(a_k\) 是不确定的,单次枚举 \(\mathcal O(n)\),总复杂度 \(\mathcal O(nq)\)。有 \(30\) 分。
如果已经分析了很多性质了,应该尝试一些算法去解决。(分析不出来任何性质也只能套算法呀QWQ)
我们已经把单次查询的复杂度降到最低了(与输入同级了),那么现在要考虑预处理些什么。
发现我们每次其实是在找 \(\max_{k\in [l,r]\setminus\{\max,\max_2\}}\{(a_{\max_2}\bmod a_k)+a_k\}\) 和 \(\max_{k\in [l,r]\{\max,\max_2\}}\{{(a_{\max}\bmod a_k)+a_k}\}\)
可以预处理这两坨。
设 \(F_1[l][r],F_2[l][r]\) 表示这两坨,尝试整体转移,然后就失败了。
因为 \(a_{\max}\) 与 \(a_{\max_2}\) 是不断变化的,\(F_1,F_2\) 不能继承之前的答案。
这提示我们固定这两个值,有一种神奇的方法
设 \(F([l,r],i)\) 表示 \(\max_{k\in [l,r]\setminus\{i,\max\}}\{{(a_i\bmod a_k)+a_k}\}\)
然后我们用 \(F([l,i-1],i),F([i+1,r],r)\) 合并出 \(F([l,r],i)\)。
这种设 \(F([l,r],i)\) 并处理 \(F([l,i-1]),i),F([i+1,r],r)\) 是一种非常实用的方法,在莫队二次离线中也用了类似的思路。
发现我们可以 \(F([l+1,i-1],i)\to F([l,i-1],i)\)。
具体的,设 \([l+1,i]\) 中的最大值下标为 \(t\):
-
若 \(a_l\le a_t\) 则 \(F([l,i-1],i)=\max((a_i\bmod a_l)+a_k,F([l+1,i-1],i))\)
-
若 \(a_l>a_t\) 则 \(F([l,i-1],i)=\max((a_i\bmod a_t)+a_k,F([t+1,i-1],i)),t\leftarrow l\)
类似的处理出 \(F([i+1,r],i)\),然后合并出 \(F([l,r],i)\) 注意这里需要特判两边的最大值
复杂度 \(\mathcal O(n^2+q)\)。可以多得 \(10\) 分
有了新的做法,根据做法分析新的性质(悲
首先发现如果 \([l,i-1]\) 中有两个数大于 \(a_i\) 那么就没必要处理了,因为 \(a_i\) 不会作为这个区间的最大值或次大值。
我们可以在尝试一下答案上下界:\(ans\le a_i\)。当 \(\frac{a_i}2<a_k\le a_i\) 的时候取等,即:若存在两个 \(a_k\) 满足那个不等式也不用搜索了。
假设我们已经知道结论后进一步分析,我们一开始假设从每个 \(i\) 开始,往左/右都恰好走移动两步。如果在 \(k\) 位置要使 \(i\) 的贡献多走一步,\(a_k\) 必定 \(\le \frac {a_i}2\),并且这对于每个 \(i\) 是不独立的即若存在 \(k<j<i\) 使得 \(j\) 多贡献 \(i\) 一步,\(k\) 多贡献 \(i,j\) 各一部。那么 \(a_k\le \frac {a_j}2\le \frac {a_i}4\)。
感性理解,这样只会减小 $\log $ 次。
如果各种计算的次数的限制是不独立的,我们可以考虑势能分析。
令势能为 \(a_{\max}^n\) 那么每多移动一步,每多移动一步,其势能就会除以 \(2\)。所以总共多移动 \(\log_2a_{\max}^n=\mathcal O(n\log a)\) 次,算上本来的 \(4n\) 次。预处理复杂度 \(\mathcal O(n\log a)\)