MX、洛谷 noip 模拟赛收录
posted on 2025-11-17 13:40:35 | under | source
P14462 【MX-S10-T3】『FeOI-4』寻宝游戏
tag:贪心、模拟、绝对众数。
考虑枚举最终归到哪个桶,考虑操作步数,那么对绝对众数分讨,若不存在,则皆大欢喜为总和除以 \(2\);若存在,则步数下界为绝对众数,因为每个至少要被操作一次,同时容易构造方案:让绝对众数与其它数扔到 \(n+1\),直到不存在绝对众数,算一下恰为下界。
不过可能奇偶性有问题,若剩下的总和为奇数需要选一个桶和基准桶一起扔到 \(n+2\),显然选剩下的最大值。
根据上述贪心,显然选最大值为基准桶最优,但由于奇偶性问题,再顺便考虑一下严格次小值。
这些信息都容易数据结构维护。
corner case:
-
上述贪心在 \(n=2\) 会有问题,因为选一个基准桶后就剩一个桶了,无法两两配对,要特判。
-
有可能归位给空桶,例如 \(a_i\) 均为 \(1\)。
总结:两两配对问题考虑对绝对众数分讨。留心 coner case。
P14463 【MX-S10-T4】『FeOI-4』呼吸之野
tag:中位数、找性质、历史线段树。
先来判定区间合法性,首先必然要做一步转化,从 \(1\dots n\) 考虑 \(x\),将 \(<x,\ge x\) 视为 \(-1,+1\),中位数 \(\ge x\) 等价于区间和 \(\ge 0\)。
考虑每个右端点 \(i\) 至多对应一个左端点(即最大的哪个),记为 \(l_i\),考虑一下存在 \(j<i,l_j\ge l_i\) 意味着什么,你发现随着 \(x\) 增大仍然 \(l_j\ge l_i\)。
证明一下,\(x\) 变大会将 \(+1\) 改成 \(-1\),只需考虑 \([l_j,j]\) 区间内的数被修改会怎样(其它情况 \(l_j\) 不变 \(l_i\) 只会变大),那么 \(l_j\) 会一直减少,我们需要证明减到 \(l_j=l_i\)(并且继续减下去)时不可能出现 \(j\) 区间的值更小,根据 \(l_i\) 性质 \([l_j,i]<0\),从而 \((j,i]<0\),所以 \([l_i,j]>[l_i,i]\);而对于初始就 \(l_i=l_j\) 的情况,如果 \(j\) 区间更小就意味着 \((j,i]\ge 0\) 这不符合设定。
那么一个右端点的存在时间为一段前缀,若能求出前缀,则计算答案直接二分就行了,因为区间不交所以左右端点递增,这样是双 log。事实上也可以对左端点跑同样的做法,那么左右端点一一对应,就可以单 log。
考虑对固定的 \(x\) 求出其有效的右端点,从左到右扫一遍,记目前最右的有效右端点为 \([l_j,j]\),考虑如何判定 \(l_i\le l_j\)。首先若 \(\sum (j,i]>0\) 则一定 \(l_i>l_j\);否则若 \(l_i\le j\) 就一定非法了,你考虑 \(l_i\) 左移的过程,若移到了 \(j\) 上此时初值 \(\le 0\) 相较于 \(l_j\) 更劣,那么不可能比 \(l_j\) 还优。综上,只需考虑 \(l_i\in [j,i]\) 的情况。
接下来是很神仙的一步,将限制放缩为 \(j-k< l_i-1\le i-k\),好处是这相当于记录从 \(j\) 扫到 \(i\) 的 \(pre_{p-k}\) 最小值,可以套用历史值线段树!具体来说,\(i\) 从 \(1\) 扫到 \(n\) 并维护每个 \(x\) 的 \(pre_{i-k}\),记录它的历史最小值,每次线段树二分找到合法前缀,将它们的 \(j\) 设为 \(i\),这相当于清空历史最值。单 log。
总结:
- 中位数转 \(+1-1\) 时,可以研究 \(mid\) 变化带来的单调性。
- 灵活运用历史值清空,可以用来刻画一类区间。

浙公网安备 33010602011771号