Loading

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}\) 即可

总结

往往需要在分析性质的时候更深入, 像这种多次操作的问题, 考虑操作一次之后再新开始考虑, 这样可以减少很多思考深度防止爆栈
然后就是要多问, 多问啊!

posted @ 2025-04-11 19:10  Yorg  阅读(10)  评论(0)    收藏  举报