930 1A
限时每日一题day16。一道比较有意思的思维交互,做出来了。
首先可以确定 \(n-1\) 和某个 \(0到n\) 中的数可以成为答案,且这个最大值为 \(11...11\),其中最高位与 \(n-1\) 的最高位相同。
\(n - 1\) 是序列中的最大值,因此可以通过 \(ask(i, i, j, j)\) 的方式 \(O(n)\) 问出最大值。设 \(p[mx_id] = n - 1\),然后,可以尝试再用 \(ask(mx_id, i, mx_id, j)\) 的方式 \(O(n)\) 问出与 \(n - 1\) 或运算后为 \(11...11\) 的所有位置,并存到一个 \(vector\) 中。由于最后要求 \(p[i] \oplus p[j]\) 最大的两个位置 \(i, j\),因此若要保证 \((n - 1) \oplus p[j] = 11...11\),则需要让 \(n - 1\) 与 \(p[i]\) 从 \(n - 1\) 最高位开始的每一位都不同。显然这个数应该是所保存序列中的最小值,因此再对保存序列 \(O(n)\) 问出最小值即可。具体细节见代码。
code