新生赛Div1后三题题解
P13696 「CyOI」出包魔法师
注意到动态调整策略一定没用,因为每张卡被选择是相互独立的,之前的情况与之后的情况无关
那么就是要选择一个对应方案最多的策略
策略可以被表示为一个 m 维向量 \([a_1,a_2,\cdots,a_m]\),其中 \(\sum\limits_{i=1}^ma_i=k\) 那么这个向量的权值就为这样的方案数,要找到方案数最多的方案
而一个策略的价值为 \(\prod_{i=1}^m\binom{l_i}{a_i}\) 这个形式可以很自然地想到分组背包,但是显然通过不了
但是分组背包给了一个很好的思路:能不能把每次多选一个看作多拿了一个物品
考虑把贡献拆到每个物品上:一个方案可以被表述为 k 个物品,每个物品的权值是这个物品加入时的贡献,要求最大化这些贡献的乘积
那么就想到能否贪心地选取这些物品,这个时候要很关注这个合法性能否保持
注意到同一个物品的第不同个的贡献是递减的,所以第 k 次加入时一定加入了前 k-1 次,是合法的(错解不优)
那么此时已经有了一个优先队列做法:用优先队列取 \(k\) 个,\(O(k\log m)\) 考虑如何优化,发现这题的目标是取出前 k 大贡献,那么显然这个东西可以采用二分
不想写分数二分,考虑对某一类物品取多少个二分,然后发现取 l 最大的二分最优
原因在于二分后会留下一个缺口,这个缺口用优先队列来补,但是这要求留下的缺口不能过大
那么就需要考虑最大的每多选一个会发生什么变化
对于 r < l,记 \(f_r(x)=\frac{r+1}{l+1}(x+1)\),即取到的前缀,由于只需要估算量级,把取整扔掉
那么考虑 \(\nabla f_r(x)=\frac{r+1}{l+1}\le 1\)(\(\nabla f(x)=f(x)-f(x-1)\))
因此中间的空隙是 \(O(m)\) 的,二分后用优先队列处理即可
复杂度 \(O(m(\log l+\log m))\)
P3899 湖南集训 更为厉害
首先发现 a,b 同时在 c 的祖先链上,那么 a 和 b 之间一定有祖孙关系,只是不知道谁上谁下
于是发生一个分类讨论:
- a 是 b 的祖先:祖孙链上两点的距离可以直接用深度相减来刻画,而 a 是 b 的祖先可以用 dfn 来刻画,能选的 c 对于同一个 b 而言是固定的,于是变成了一个二位偏序问题,直接扫描线 \(O((n+q)\log n)\)
- b 是 a 的祖先:可选的 b 的数量 \(=\min(dep(a)-1,k)\),而对于所有的 b,可选的 c 均取决于 a,直接 O (1) 算出
时间复杂度 \(O((n+q)\log n)\)
P7670 JOI 2018 Final 毒蛇越狱 Snake Escaping
看到这种查询很容易想到前缀和,但是发现前缀和之后复杂度还是指数级的
不过注意到它们的指数不一样
- 对?暴力枚举
- 预处理 1 的超集和,然后对 0 容斥
- 预处理 0 的超集和,然后对 1 容斥
记?, 0,1 的数量分别为 \(a,b,c\) ,则有 \(a + b+c = n\)
则三种暴力分别为 \(2^a,2^b,2^c\)
那么取三者中的最小值,一定 \(\le \frac n 3\) 于是时间复杂度 \(O(q2^{\frac n 3})\)
严格推导:
记
将指示条件代入求和,仅保留 \((O,Z)\) 中位置的取值约束,\(Q\) 方面没有约束:
时间复杂度为 \(O\bigl(2^{|Q|}\bigr)\)
利用恒等式 \([\alpha_i = 1] = 1 - [\alpha_i = 0]\) 对 \(O\) 中位置做容斥:
令 \(g(S) = \displaystyle\sum_{\alpha \subseteq U} f(\alpha) \prod_{j\in S} [\alpha_j = 0]\)(对应子集和变换),则
时间复杂度为 \(O\bigl(2^{|O|}\bigr)\)
对 \([\alpha_j = 0]\) 一侧做对称容斥同理,使用超集和即可

浙公网安备 33010602011771号