4.10 CW 模拟赛 T4. 绳网委托
思路
首先, 发现操作的左右端点在连续段的中间显然不优, 每段可以被视作一个整体
这个较为直观
考虑最大子段和如何求, 不难发现为 \(\max\limits_{c} \textrm{suf}_c + \textrm{pre}_c\)
翻转 \(k\) 次之后怎么求?
不难发现一次翻转可以掏一个遥远的子段出来和当前段合并, 于是猜想可以贪心去找对于一个分割点之后的前 \(k\) 大 \(\textrm{pre}\), 然后就趋势了, 赛时不知道怎么叉自己
以上是赛时做法
这个神秘东西确实有点过于神秘了, 导致我没法数据检验, 然后就趋势了
经过一段时间的对拍发现, 其实思路大概是对的, 但是问题出在不只有 \(0\) 段可以翻转, 还有 \(1\) 啊
因此可能需要更一般的思考
体现了找点性质为什么这么难
问题出在 \(0, 1\) 段翻转是否可以交替, 这个极大影响结果
经过一定的思考, 发现可以交替
因此问题就可以变成枚举分割点, 然后找前后的前 \(k\) 大段, 加上当前前缀
需要一些更深刻的理解
首先将每段视作一个整体
然后通过最大子段和的计算, 发现分割段之后的做法, 这个是显然的
发现对于一个分割段, 我们可以通过合并前 \(1\) 后 \(0\) 来取到最大值, 然后就做完了
深刻你妈呢? 理解不充分不如充分不理解
考虑画画, 你做这种题不多模拟是想干什么, 一眼看出来?
看题解看上瘾了没题解不会做题, 分析问题就用眼睛看???
什么勾八
不难猜测每段应该作为一个整体考虑, 但是为什么呢?
你可以发现任何一种不作为整体的反转方法, 都一定有一种作为整体的反转方法比他更优, 这是比较直观的
然后你会发现最优解可能是合并前 \(1\) 后 \(0\), 也有可能是放弃前 \(0\) 换后 \(1\) 或者放弃后 \(1\) 换前 \(0\), 反正就是非常复杂不可做
于是我们考虑将问题简单化
还是考虑没有反转操作
\(\max\limits_{c} \textrm{suf}_c + \textrm{pre}_c\)
考虑若 \(a_i = 0\) 则赋权为 \(1\), 若 \(a_i = 1\) 则赋权为 \(-1\)
则一个 \(01\) 序列的答案就是 \(cnt_1 + s_x\) , 其中 \(cnt_1\) 是整个序列中 \(1\) 的个数, \(s\) 是权值的前缀和数组, \(x\) 是分界点
于是上述问题便可以简化为找最大的 \(k\) 个不交区间和加上一段前缀这样, \(\rm{dp}\) 可做
烦烦烦, 不行必须搞出这个题
网易云
深刻感受到了 \(\rm{hyh}\) 的可怕, 我只能说这是智商上的碾压, 但是我感觉我的凭啥错啊, 他也没考虑放弃前 \(0\) 换后 \(1\) 或者放弃后 \(1\) 换前 \(0\) 啊?
不难发现一次翻转的贡献就是我所想的那样, 那为啥我是错的???
感觉有点小彻小悟
大彻大悟
发现会漏掉反转之后接着贪的情况
因此只能 \(\rm{dp}\), 因为前面取到最优确实是后面最优的前置条件, 于是考虑 \(\rm{dp}\) 即可
总结
往往需要在分析性质的时候更深入, 像这种多次操作的问题, 考虑操作一次之后再新开始考虑, 这样可以减少很多思考深度防止爆栈
然后就是要多问, 多问啊!

浙公网安备 33010602011771号