4.10 CW 模拟赛 T2. 实战教学
前言
我是人吗? 我到底是人吗?
最大的问题仍然是利用率
补题方法需要改进, 其他的动不动无所谓, 可以等一手大佬指导
思路
给定两个长为 \(2n\) 的序列 \(a, b\), 需要将 \(1 \sim 2n\) 不重拆分成 \(n\) 个二元组 \(\{x_i, y_i\}\)
一种拆分的威力定义为 \(\max\limits_{i = 1}^{n} \Big\{\max(a_{x_i}, a_{y_i}), \max(b_{x_i}, b_{y_i})\Big\}\)
求所有拆分中, 威力最小的那一种
考虑找点性质
本能肯定是想转化为判定类问题, 但是怎么搞?
最初想的是钦定两个位置, 再在其他位置上做最优配对, 但是发现这个东西严格劣于直接二分答案 \(x\)
那不妨尝试一下二分答案 \(x\), 然后考虑怎么判定
按 \(a_i\) 从大到小考虑, 与它配对的必然有 \(b_j \leq x - a_i\), 容易发现, \(a_i\) 越大, 限制就越紧, 即符合限制的元素越少
我们按 \(a_i\) 从大到小考虑, 限制是越来越宽松的, 符合 \(a_{i + 1}\) 限制元素的集合必然是符合 \(a_i\) 限制的集合的子集, 所以我们在当前集合中选择时不需要考虑对后续集合的影响还是因为 \(a_i\) 越大限制就越紧, 所以我们如果能提前选掉 \(a_j\) 大的元素, 后面选择的时候就更可能有解。
具体来说就是我们在符合当前限制的所有元素中选择 \(a_j\) 最大的元素, 可以用一个 \(\rm{set}\) 维护
这是一个并不算显然的贪心, 考虑证明
证好像是不太行的, 反正就是把决策权留到后面去
总结
做题的时候遇到严格劣于的形式不直接去考虑更优的做法而是直接跑了是啥啊?
不过这种神奇贪心还是要多积累, 考一次寄一次

浙公网安备 33010602011771号