CF1969

关注 FD 喵,FD 的题解好看喵。
更好的观看体验

B

给定一个 01 串,要把它升序排序。
每次操作可以对一个子串循环右移一次,花费该子串的长度的代价。
最小化代价和。
$n\le 10^5$

贪心地每次操作形如 1110 的端就是最优的。
证明考虑下界:每个 1 向右移动至少花费 1 的贡献,每个 0 若左侧有 1 至少花费 1 的贡献,该贪心卡到了下界。
代码

C

给定一个数组,每次操作可选择一个位置,并用它相邻的一个位置的值来替换它。
在不超过 k 次操作内最小化数组的值和。
$n\le 10^5,k\le 10$

最优操作形如用一个值去覆盖一段包含它的区间,且不可重复覆盖。
直接 dp 即可,复杂度 \(\mathcal O(nk^{2})\)
代码

D

有若干物品,每个物品由一个二元组 $(a_i,b_i)$ 描述,分别表示进价与售价。
A 可以选择任意个从中进货,付出进价之和的代价,B 要买走 A 中手里的所有东西。
B 可以免费拿走 A 手中的至多 m 件物品,剩余的物品 A 将会以售价购买。
A 想赚尽量多的钱,B 想花尽量少的钱,求最优策略下 A 赚的钱。

B 的策略显然是拿走 \(b_i\) 前 m 大的物品,与 \(a_{i}\) 无关。
那么考虑先把物品按照 \(b_{i}\) 排序来看,发现 A 的最优策略应当是花费尽量少的 \(a_{i}\) 凑齐前 m 大,选择其余的部分所有 \(b_{i}>a_{i}\) 的部分购买。
所以枚举这二者之间的分割线,用堆维护即可。
代码

E

称一个序列是合法的,当且仅当其中存在一个元素只出现了一次。
给定一个序列,你可以把其中任意位置替换为任意整数。
求最小的操作次数,使得原序列的所有子区间都合法。
$n\le 10^5$

相信自己。

思路解析

从区间角度去分析几乎是不可做的。
尝试分析合法序列本身的性质。
注意到有区间单调性,考虑进行贪心分段。
想办法维护合法区间。

正解

操作相当于是选定一个位置,把左右两部分隔断。
那么最终的答案形态形如选定若干位置,使得任意区间都是好序列(所有子区间都合法)。

由于这个好序列显然具有区间单调性,所以我们考虑进行贪心分段。
想办法判定加入一个位置是否仍是好的,只需判断所有 \(\forall l\in[p,r]\)\([l,r]\) 是否合法。
合法是一个 bool 型,考虑变为统计区间内是否存在孤立元素,并对孤立元素计数,然后数据结构维护。
那么线段树区间加区间 min 维护即可。

另一个角度来看,原问题可以等价地转化为对于每一个原序列的子区间,若其不合法,则至少取一点。
这个问题显然是贪心地尽量靠右取,然而把区间都拍出来并不现实。
考虑我们可以扫描线去扫,每次确认是否有左端点 \(>pre\) 的不合法区间即可。
这时候两个解决方法就等价了。

F

[Luogu](https://www.luogu.com.cn/problem/CF1969F)
你是袁绍,你要使用乱击。
现在有一个牌堆,用一个序列从上到下表示每张牌的花色,共有 k 种花色。
初始你摸(从牌堆顶)k 张牌,然后每回合选择两张牌打出。
若此时你打出的两张牌花色相同,那么你就可以高喊:”全都去死吧!“,然后使用一次乱击。
(如果花色不同也要打两张牌。)
然后若牌堆不空,摸两张,知道手里没有牌。
最大化乱击的次数,保证 n 和 k 都是偶数。
$n,k\le 1000$
思路解析

贪心地乱放箭,考虑到需要决策的状态唯一。
考虑用 dp 去辅助决策,设计状态,转移往大了想再优化。
大力找性质,发现后继状态只有 \(\mathcal O(n)\) 种,且可以枚举到。
注意到可以用异或哈希维护,再去掉一个 \(n\)

正解

显然手里如果有成对的牌直接打出即可,并且任意的一对都可以,毕竟你把抉择往后拖一拖总是更优的。
那么决策点在于,手中没有对的时候应该打什么牌。

注意到假如牌堆里有牌,那么此时你的手牌数恒定为 k,而牌堆里无牌的时候直接打就可以了。
所以发现关键点在于中间的时候手中没有对子,此时一定是所有花色各一张,状态是唯一的。
于是就可以考虑用 dp 来决策了,状态只需设在什么时候手中没有对子。

然而值域如果设获得金币数的话,并不太好处理答案。
考虑另一个角度,从 损失 的角度去设计,上界显然是 \(\sum\limits \left\lfloor \frac{c_{i}}{2} \right\rfloor\),只有在手中无对状态下,打出的那张牌在后面出现了奇数次是会有 1 的负贡献。

这里要讨论一下关于对该状态后效性的考察。
正常决策正着来肯定正确,直接倒着来想来也正确,因为能写出一个贡献和式。
所以只需要想到这道题只有在决策时会有负贡献,就没有未知的后效性了。

转移暴力,枚举打出什么牌,然后模拟找到下一次进入该状态的位置,转移即可,复杂度 \(\mathcal O(n^{4})\)
考虑大力优化:
注意到下一次进入状态的一个必要条件(不充要是因为中间可能会出现另一次进状态),是当时的奇偶性与枚举扔掉的牌有某种关系。
这就导致了至多只有 \(\mathcal O(n)\) 种状态,且扔两组不同的牌不会到达相同的状态。
并且由于答案只与当前枚举扔掉的牌有关,所以若扔掉的牌贡献相同,而枚举找位置的时候直接到达了结尾,则接下来的其他同贡献扔牌就无用了。
另一个优化是,维护 cnt 数组过于过程化,考虑直接异或哈希,这同样解释了上面为什么只有 \(\mathcal O(n)\) 种状态。

两个优化加起来可以做到 \(\mathcal O(n^{2}\log n)\),当然直接 \(\mathcal O(n^{3})\) 由于卡不满也是能过的。

posted @ 2024-11-22 19:31  Sugar_Cube  阅读(32)  评论(0编辑  收藏  举报