ABC303 G 题解

区间 DP。

fl,r 表示只考虑 [l,r],先手得分减后手得分的最大值(并不关心谁是先手谁是后手),区间长度 len=rl+1

然后对三种情况分别讨论:

  • 使用操作一,此时取掉左/右端点的部分先手后手互换,对答案的贡献为 max(alfl+1,r,arfl,r1)

  • 使用操作二,继续分讨:

    • lenB:直接全部取走,贡献为 (i=lrai)A
    • len>B:考虑将 B 的长度分配给前缀和后缀,贡献为 maxi=0B(i=ll+i1ai)+(i=r(Bi)+1rai)Afl+i,r(Bi)
  • 操作三同理:

    • lenD:直接全部取走,贡献为 (i=lrai)C
    • len>D:考虑将 D 的长度分配给前缀和后缀,贡献为 maxi=0D(i=ll+i1ai)+(i=r(Di)+1rai)Cfl+i,r(Di)

然后对上述贡献取 max 就是 fl,r 的值。

用前缀和维护一下即可做到 O(n3)

Code

考虑优化。容易发现,此时操作一、操作二和操作三的第一种情况复杂度都是对的。只有操作二、操作三的第二种情况需要枚举长度,时间复杂度 O(n)

考虑对 len 相同的区间同时处理:记 j=Bii 就是操作二转移方程里的,操作三同理),s(l,r) 表示 [l,r] 的区间和。转化一下转移方程:

maxi=0Bs(l,l+i1)+s(rj+1,r)Afl+i,rj

=maxi=0Bs(l,r)s(l+i,rj)Afl+i,rj

这个时候我们发现 s(l,r)A 是定值。提出来,就变成了:

s(l,r)Amini=0Bs(l+i,rj)+fl+i,rj

现在考虑维护后面这坨东西。

容易发现,[l+i,rj] 这个区间的长度是不变的,都为 lenB。令 gi=fi,i+lenB1+s(i,i+lenB1)。此时发现方程就是

s(l,r)Amini=ll+Bgi

然后直接用 ST 表维护 mingi 即可。对于不同的 len 直接重构即可。时间复杂度 O(n2logn),可以通过此题。

Code

posted @   Southern_Dynasty  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示