CSP-S模拟6

CSP-S模拟6

赛时

开 T1,发现还有口,马上口胡主席树,发现根本不可做。

一会儿立即发现重要性质,\(n\)\(m\) 较小数小于 \(\sqrt V\),直接上一个 \(O(n^2m)\) 就过了。

马上码完直接过。

开 T2,发现是神秘dp,马上想出 \(O(n^2)\) 转移。

迅速思考如何优化,发现都不好做,于是想要枚举最大值,然后左右分别转移,但是 \(\sum s_i\) 的限制把这个做法叉了。

但是瞬间想到了可以将 max 和 dp 分别处理,然后线段树直接查询最小值即可,发现就是一个后缀推平,单点修改的线段树,直接写。

写的时候才发现,这题好像是原,当时做法和现在一致。

马上码完,发现 dp 没有 pushup,改完立马过。

T3 想了一个贪心,发现可以以子树内零的个数除以一的个数进行贪心,不过没想到怎么动态维护。

T4 读假了,连暴力都挂了 10 分。

T1 花海

挺水的,发现竟然是乘积小于一个数,并暴力的给了3s时限,直接类似根号分治做完了。

然后暴力枚举其中一维的区间,然后扫一遍上一个差分,维护max即可。

T2 划分

这感觉不太能到紫。

发现可以写成如下 dp:

\[dp_i = \min_{\sum_{k=j}^{i}{a_k}\le m}\{{dp_j+\max_{j+1\le k\le i}{\{a_k}\}}\} \]

直接做好像根本不好做,考虑优化。

发现其实 \(max\) 的限制是一段后缀一段后缀的,故而可以使用线段树维护区间推平或区间取 \(max\),然后 \(dp_i\) 的更新本质就是进行一个单点修改。

直接线段树维护就做完了。

T3 落子无悔

还有小黑子

考虑直接贪心,很轻松的可以想到一个假做法,设 \(a_i,b_i\) 为子树内0/1的个数,直接以 \(\frac{a_i}{b_i}\) 排序即可。

但是假了,为什么呢?

因为删除一个节点后,会产生新的节点,又会产生不同的贡献,而使得这个节点不优。

那么考虑不做父亲的限制,每次找到最优的就和父亲合并,然后考虑父亲的贡献即可。

严格证明我不会。

T4 体测

发现如果只有一个颜色,每次选择右端点最小的区间肯定不劣,但是很可能会出现右端点相同的情况。

这时因为左端点越靠左这个区间越大,所以可以将左端点较大者的右端点向右移动,可以发现这对答案没有根本性影响。

这样每次处理一个颜色就做完了,考虑怎么扩展。

其实只需要将落在当前枚举的右端点中的这些区间中的同一个颜色右端点最小的删去即可,因为这个最靠左的右端点一定很劣。

这样使用 set 大份维护就行。

posted @ 2025-07-25 19:03  QEDQEDQED  阅读(67)  评论(1)    收藏  举报