首页 > 其他分享 >ABC303 G 题解

ABC303 G 题解

时间:2024-02-28 15:25:55浏览次数:14  
标签:题解 sum 长度 len 贡献 ABC303 max 操作

区间 DP。

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

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

  • 使用操作一,此时取掉左/右端点的部分先手后手互换,对答案的贡献为 \(\max(a_l-f_{l+1,r},a_r-f_{l,r-1})\)。

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

    • \(len\le B\):直接全部取走,贡献为 \((\sum_{i=l}^{r}a_i)-A\)。
    • \(len>B\):考虑将 \(B\) 的长度分配给前缀和后缀,贡献为 \(\max_{i=0}^{B}(\sum_{i=l}^{l+i-1}a_i)+(\sum_{i=r-(B-i)+1}^{r}a_i)-A-f_{l+i,r-(B-i)}\)。
  • 操作三同理:

    • \(len\le D\):直接全部取走,贡献为 \((\sum_{i=l}^{r}a_i)-C\)。
    • \(len>D\):考虑将 \(D\) 的长度分配给前缀和后缀,贡献为 \(\max_{i=0}^{D}(\sum_{i=l}^{l+i-1}a_i)+(\sum_{i=r-(D-i)+1}^{r}a_i)-C-f_{l+i,r-(D-i)}\)。

然后对上述贡献取 \(\max\) 就是 \(f_{l,r}\) 的值。

用前缀和维护一下即可做到 \(O(n^3)\)。

Code

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

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

\[\max_{i=0}^{B}s(l,l+i-1)+s(r-j+1,r)-A-f_{l+i,r-j} \]

\[=\max_{i=0}^{B}s(l,r)-s(l+i,r-j)-A-f_{l+i,r-j} \]

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

\[s(l,r)-A-\min_{i=0}^{B}s(l+i,r-j)+f_{l+i,r-j} \]

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

容易发现,\([l+i,r-j]\) 这个区间的长度是不变的,都为 \(len-B\)。令 \(g_i=f_{i,i+len-B-1}+s(i,i+len-B-1)\)。此时发现方程就是

\[s(l,r)-A-\min_{i=l}^{l+B}g_i \]

然后直接用 ST 表维护 \(\min g_i\) 即可。对于不同的 \(len\) 直接重构即可。时间复杂度 \(O(n^2\log n)\),可以通过此题。

Code

标签:题解,sum,长度,len,贡献,ABC303,max,操作
From: https://www.cnblogs.com/syzqwq/p/18040520

相关文章

  • P1668 题解
    两种做法。一、最短路题目要求区间数量最小。如果能建出图来,就可以转换为最短路问题。具体地,我们从\(l-1\tor\)连一条长度为\(1\)的边,意味着要多经过\((l-1,r]\)这一个区间。这是左开右闭的形式。现在还有一个问题:通过这种边我们只能到达区间的右端点,如果想向左到达区......
  • P1266 速度限制 题解
    考虑分层图。把图按速度分成\(V\)层,\(f_{i,j}\)表示点\(i\)在第\(j\)层(速度为\(j\))的编号。注意:这里的速度为\(j\)是指到达\(i\)那一条边的速度(\(i\)为终点)。考虑一种naive的建边方式:首先,记当前点为\(u\),速度为\(i\);\(u\)的出边速度为\(j\),长度为\(l\),终点......
  • ABC302 Ex 题解
    首先我们考虑\(v\)固定怎么做。实际上就是ARC111B。考虑建图,对每个\((a_i,b_i)\)建一条无向边,那么问题就变成了:对于每条边都要选择它以及其连接的一个点,最大化选出的点数。很明显可以对每个连通块分开考虑。记当前连通块的点数为\(V\),边数为\(E\)。那么有结论:该连通块对......
  • ABC301 Ex 题解
    题意:你有一张无向连通图,定义\(d(s,t)\)表示从\(s\)到\(t\)所有路径中最大边权的最小值。现在给你三个数\(A_i,S_i,T_i\),让你求出当\(A_i\)这条边的边权\(+1\)时,\(d(S_i,T_i)\)会增加多少。首先考虑一下\(A_j+1\)什么时候会对\(d(S_j,T_j)\)有影响。\(A_j>d(S_......
  • 第五届图灵杯中级组题解
    网址赛时得分\(25+50+5+1=81\),rk67,逊死了。赛后发现T1爆搜+剪枝有\(50\)分,我【】【】。总结:还是菜。A.等差数列首先特判\(n\le4\)的情况。此时答案必然为Yes,只需要两两分组即可。由于第一个数必然在其中一个等差数列内,不妨强制令其在第一个等差数列内。考虑......
  • CF351D - Jeff and Removing Periods 题解
    首先做一点显然的转化:在进行第一次操作之后,可以将相同的数排在一起,这样一次就能删掉一种数。如果一开始就能删光一种数的话,那么次数就是区间颜色数,否则就是区间颜色数\(+1\)。所以现在原问题变成了两个问题:求区间内不同颜色数,判断区间内是否有某种颜色满足其出现位置构成等差数......
  • P9755 [CSP-S 2023] 种树 题解
    首先考虑如何求出第\(i\)棵树在\([l,r]\)时间段能长多高。这个东西可以差分一下然后等差数列求和。放一下代码:inlinelllcalc(inti,intx){ if(c[i]>=0){ return(lll)b[i]*x+(lll)c[i]*x*(x+1)/2; }else{ intd=(b[i]-1)/(-c[i]); if(x<=d)return(lll)b[i]*x+(l......
  • A-E题解
    A:对于任意一个满足条件的2*2矩阵,要么3个R和1个W,要么3个W和1个R。我们以3个R和1个W举例,只有以下4中情况满足:RR   RR   RW   WRRW  WR  RR   RR所以一种构造方法如下:奇数行全部放R;偶数行奇数列放R,偶数列放W即可。voidsolve(){intn;......
  • CF756D Bacterial Melee 题解
    给一个\(O(n^2)\)的做法。考虑从左到右扫描最终得到的字符串,如果当前的字符和前一个字符相同,就删掉这个字符。由题意可知,最终得到的字符串一定是\(s\)的一个子序列。我们定义状态\(dp[i][j]\)表示:当前子序列的最后一个字符是\(s[i]\),已经填完了最终字符串的前\(j\)个字......
  • CF1034E Little C Loves 3 III 题解
    这道题与P6097【模板】子集卷积基本相同,但是每个元素的值属于\([0,3]\),且\(n\le21\),时限\(\rm1s\)。在做P6097这道题的时候,我们多开了一维用来记录二进制下\(1\)的个数。但是这道题每个元素的值只属于\([0,3]\),我们可以用一种十分巧妙的方法:我们设\(f(x)\)表示\(......