NOIP2024集训Day71 贪心
NOIP2024集训Day71 贪心
A. [BalticOI2016 Day2] 交换
看到 \(x\) 和 \(\displaystyle\left\lfloor\frac{x}{2}\right\rfloor\) 我竟然没有想到树形结构,怕不是要废了
将 \(x\) 和 \(\displaystyle\left\lfloor \frac{x}{2} \right\rfloor\) 连边,交换操作即交换一对父子。我们需要贪心地将最小值换到根上。
容易发现处理完一个节点后,其两个子树变成独立的子问题。故考虑如何处理一个节点。
考虑 \(a\),\(b\),\(c\) 三个节点。其中 \(a\) 是 \(b\) 和 \(c\) 的父亲,显然当最小值取到 \(x_a\) 或 \(x_b\) 上时,均可以以唯一方式交换到 \(a\) 上,故方式确定。
当最小值取到 \(c\) 时,我们发现需要讨论 \(x_a\) 和 \(x_b\) 如何分配给 \(b\) 和 \(c\)。
但事实上根本不需要讨论,暴力搜索出所有状态即可。总状态数只有 \(\Theta(n\log n)\),因为一个节点可能被分配的值只有其祖先和祖先的兄弟上的值。
B. [CCO2015] 饥饿的狐狸
显然的,要求出最大美味值,应该先交错吃温度最大的和最小的饼干。所以我们给所有饼干按照温度排序,交替选择左右端点吃,如果喝水能够达到更大那就先喝水再吃,反正水管够。分两种情况,即左右端点谁先开始,再取个 \(\operatorname{max}\)。
要求出最小美味值,就按照温度顺序吃饼干。注意讨论一下:
- \(T_1 \le W \le T_n\),则答案为 \(T_n - T_1\),因为中间项全都被约掉。
- \(W \lt T1\),则答案为 \(T_n - T_1 + T_1 - W\),即 \(T_1 - W\)。
- 若 \(W \gt T_n\),则答案为 \(W - T_1\)。
合并一下三种情况,即可得到 \(ans_{min} = \max(0, W - T_1) + \max(T_n - W, 0)\)。
感觉不像个蓝题,有点水了
C. [NOI2010] 超级钢琴
可以先对 \(1\sim n\) 中的每一个 \(i\) 假设它为左端点,求出区间 \([i+l-1, \min(i + r - 1, n)]\) 中的一个右端点 \(s\),使得对于任意一个 \(j\in [i + l -1, \min(i + r - 1, n)]\),满足 \(\displaystyle\sum_{x = i}^s a_x \ge \sum_{y = i}^j a_y\)。处理这个可以直接对每个位置的前缀和求 \(\operatorname{RMQ}\)。
然后将每个 \([i + l - 1, s]\) 的区间和放入一个堆中维护。
看一张图:
可以发现,\([i+l-1,s-1]\) 和 \([s+1,\min(i+r-1,n)]\) 两个区间中也可能含有使答案区间和前 \(k\) 大的右端点。
所以,对于一个答案,在将其统计之后,需要将它重新拆分成两部分分别放回堆中,这样才能保证没有遗漏。
D. [AGC034C] Tests
首先最多只会有一场考试不是 \(0\) 分或 \(X\) 分,因为如果有两场考试都是 \(\gt 0\),\(\lt X\) 的话,一定可以把其中一场考试分数分给另外一场考试一些会更优。
然后枚举一下哪个不是 \(0\) 分或 \(X\) 分的考试就行了。剩下的提前排好序,贪心选最好的几个。
E. [ARC147E] Examination
相当于我们要钦定一个最小的集合 \(S\),将 \(S\) 中的元素重排,使得 \(S\) 中的元素全部满足,并且 \(S\) 外的元素本来必须满足条件。原本不满足的元素必定要在 \(S\) 中,要将最少的合法的元素加入 \(S\) ,使得 \(S\) 重排后合法。
判断 \(S\) 是否有解的充要条件为,将 \(S\) 中的 \(A,B\) 从小到大排序后,\(\forall i\in S,A_i\ge B_i\)。
发现这个条件并不好用,于是我们转化一下,设 \(cnt_t=\sum_{i\in S}[B_i\le t]-[A_i\le t]\),充要条件为 \(\forall t\in N,cnt_t\ge 0\)。
这样每次找到一个最小的 \(t\) 使得 \(cnt_t<0\),然后从合法的元素中,为使 \(cnt_t\ge 0\),我们要挑选一个满足 \(B_i\le t,A_i\gt t\),显然贪心地选 \(A_i\) 最大的会比较优,如果找不到这样的元素,则无解。
时间复杂度为 \(\Theta (n\log n)\)。