NOIP2024集训Day71【贪心】
A. 交换
这道题的难点在与记忆化的状态。
可以很容易的想到从前往后考虑,把交换 \(x_i\) 和 \(x_{\lfloor i/2\rfloor}\) 看作二叉树上儿子与父亲结点的交换。所以以一个父亲加两个儿子为基准的交换方式只有四种。
其中如果把父亲的权值是最小的,就不改变。如果左儿子权值最小,则只交换左儿子和父亲。这两种情况都是固定的,但是如果右儿子权值最小,把右儿子放到父亲的位置过后父亲和左儿子的位置是不确定的。
由于没有什么很好的贪心策略解决这种不确定,遂考虑搜索。考虑左儿子和父亲的权值中较小的那个放在哪个子树里的位置最考前,用另一个函数搜索这个位置。
搜索位置的函数需要知道当前在那一层和从祖先中传下来的权值是什么,但是考虑一个位置传下来的权值最多有 \(logn\) 个,可以记忆化。然后就是细节了。
B. 饥饿的狐狸
就是道简单的贪心题。最小值肯定是在 \(T\) 里算上 \(W\) 后的最大值 \(-\) 最小值。
最大值就是每次选差最大的,相当于从小到大排序过后前后交替选,分别考虑下是从前还是从后开始就行了。
C. 超级钢琴
做过。
D. Tests
这道题的 \(s\) 有单调性,考虑二分。
如果 \(a_i\) 和 \(b_i\) 已经配对好,那么如果 \(a_i \le b_i\) 那么 \(c_i\) 一定取 \(l_i\) 否则一定取 \(r_i\)。
而且还可以发现 \(a_i\) 中最多只有一个不是 \(0\) 或 \(X\)。因为如果有两个不是 \(0\) 或 \(X\) 的,就一定可以把其中一个调整到 \(0\) 或 \(X\) 从而使答案更优。
所以我们可以把二分出答案后,有 \(\lfloor mid/X \rfloor\) 个取 \(X\) 的 \(a_i\),和一个取 \(mid \% X\) 的 \(a_i\)。
计算总和的话,可以先把每个 \(a_i\) 都选 \(0\) 的答案预处理出来,再按照每个 \(a_i\) 选 \(X\) 的答案和选 \(0\) 的差从大到小排个序,要选就选考前的 \(a_i\) 变成 \(X\),用前缀和维护一下就行。
再枚举哪个 \(a_i\) 变成 \(mid \$ X\),求个 \(max\),看最后是否 \(\ge 0\)。
E. Examination
肯定先考虑 \(B_i \gt A_i\) 内部消化,把这些部分的 \(A_i\) 和 \(B_i\) 分别扔进大根堆里。
如果 $top_A \ge \(top_B\) 则可以就这样配对了,否则要从 \(B_i \le A_i\) 中选。我们把 \(A_i\) 大于 \(top_B\) 的所有 \(B_i\) 扔进小根堆里,贪心的想,肯定是选 \(B_i\) 小的与 \(top_B\) 配对更好。所以把 \(top_B\) 弹出,再把最小的 \(B_i\) 加进去并对答案 \(+1\)。如果没有 \(A_i \ge top_B\) 的没有被选过的人,则不合法,输出 -1
。
F. Shopping
考虑最后的答案一定是 \(2L\) 的倍数,则统计是 \(2L\) 的多少倍就行了。
考虑每个可以对答案直接加上 \(\lfloor t_i/2L \rfloor\),并对 \(t_i \% 2L\),这样对答案没有影响并且每个 \(t_i\) 都 \(\lt 2L\)。
再考虑每个商场火车从左往右走到它后再返回来碰到它时是否已经购物完毕,得到数组 \(l_i=[(L-x_i)\times 2 \le t_i]\)。同理可得 \(r_i=[x_i \times 2 \le t_i]\)。
对于最差的情况,答案会为 \(n+1\),当有一组 \(i, j\) 使得 \(i \lt j\) 并且 \(r_i=l_j=true\),答案就会减小 \(1\)。
而由于每个 \((l_i,r_i)\) 的二元组 \((1,0)\) 一定在 \((0,1)\) 的左边,所以 \((1,0)\) 和 \((0,1)\) 都一定会和 \((1,1)\) 配对。
相当于先把 \((1,1)\) 和其它的配对,再内部消化。
最后把答案 \(\times 2L\) 即可。