Watering an Array

我们发现每次操作二之后序列都会变成全0,所以全0序列是一个非常特殊的序列,我们考虑从他开始的最大收益是多少

由于我们接下来只能实施操作一,所以我们可以发现,任意一个时刻我们都不可能有两个位置满足ai=i,可以反证,假设ai=i,aj=j,ji,那么对于j来说,肯定被加了j次,而这j次一定也会加到i上面,所以ai=j>i,矛盾(其实也不难发现任何时刻的序列a都是一个非减序列,所以这个引理也是比较显然的)

所以我们的最大收益就是d2,即一次操作一后紧跟操作二

那么我们就有一个初始的暴力算法了,就是枚举我们最开始会进行多少次操作一后进行第一次操作二

但是这样太慢了,我们一定会有一个比d更小的上界,当达到这个上界的时候,在进行操作一一定不会更优,因为一定会有一种比上界低的操作比其更优越

我们考虑答案的组成,为sum+di2,其中sum是第一次操作二的贡献

所以我们只用考虑前2n天,因为如果进行更多的操作一,sum也不会超过n,而我完全可以通过后面的di2来贡献了

update 2024.7.10

看到了n2000,可以往平方算法上面想,然而这里的上界一定是2n,不能错误认为最多只会加n次,因为每一次的加法操作不一定覆盖整个序列,所以超过n次之后可能sum还会增加

posted @   最爱丁珰  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示