专栏文章

Sol P8490

P8490题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip7r2eb
此快照首次捕获于
2025/12/03 07:32
3 个月前
此快照最后确认于
2025/12/03 07:32
3 个月前
查看原文
直接令 fi,jf_{i,j} 表示前 ii 列,第 ii 列修高度为 jj 的长堤最大重量是很不好转移的,因为你没办法知道 i1i-1 列的鱼是否已经计算过贡献了。
可以发现,如果钦定第 ii 列的鱼只能被其左边或只能被其右边的长堤抓住是不影响答案的,因为如果一个鱼被左边(或右边)的长堤抓住,则这一列高度低于这条鱼的鱼同样能被左边(或右边)的长堤抓住。
f(i,j,0/1)f(i,j,0/1) 表示第 ii 列修的长堤长度为 jj,钦定第 ii 列只能被其左边(或右边)的长堤抓住,前 ii 列抓住的鱼最大重量,Wx,yW_{x,y} 表示第 xx 行第 yy 列的鱼重量(如果没有鱼则 Wx,yW_{x,y} 视为 00)则有:
f(i,j,0)=max{max(f(i1,j,0),f(i1,j,1))     Imaxk<j{f(i1,k,0)},IImaxk>j{f(i1,k,0)+jy<kWi,y},IIImaxk<j{f(i1,k,1)+ky<jWi1,y}IV}f(i,j,1)=max{f(i1,j,1)Vmax{f(i1,k,0)}, VImaxk<j{f(i1,k,1)+ky<jWi1,y}VII}\begin{aligned} f(i,j,0)=\max\{\\ &\max(f(i-1,j,0),f(i-1,j,1))\qquad\qquad\qquad\ \ \ \ \ \mathrm{I}\\ &\max\limits_{k<j}\{f(i-1,k,0)\},\qquad\qquad\qquad\qquad\qquad\qquad\mathrm{II}\\ &\max\limits_{k>j}\{f(i-1,k,0)+\sum\limits_{j\le y<k}W_{i,y}\},\qquad\qquad\qquad\mathrm{III}\\ &\max\limits_{k<j}\{f(i-1,k,1)+\sum\limits_{k\le y<j}W_{i-1,y}\}\qquad\qquad\qquad\mathrm{IV}\\ \}\\ f(i,j,1)=\max\{\\ &f(i-1,j,1)\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\mathrm{V}\\ &\max\{f(i-1,k,0)\},\qquad\qquad\qquad\qquad\qquad\qquad\ \,\mathrm{VI}\\ &\max\limits_{k<j}\{f(i-1,k,1)+\sum\limits_{k\le y<j}W_{i-1,y}\}\qquad\qquad\qquad\mathrm{VII}\\ \} \end{aligned}
这是 O(n3)O(n^3) 的,考虑优化。
观察转移式子,I,II,V,VI\mathrm{I,II,V,VI} 可以双指针直接维护,对于 III\mathrm{III},当 jj1j\gets j-1 时,对于 k>jk>j 的部分,上面这坨式子的值会增加 Wi,j1W_{i,j-1},这个相当于后缀加求后缀 max\max,直接上线段树总复杂度是 O(nlogn)O(n\log n) 的,实际上可以 O(n)O(n),而且比线段树好写,但是做的时候犯唐了没想到(),IV,VII\mathrm{IV,VII}III\mathrm{III} 思路是类似的,前缀加前缀 max\max
可以发现长堤要么修到 NN,要么恰好修到鱼下面一格,证明就是如果原来第 ii 列长堤长度为 jj(i,Y)(i,Y) 有鱼且到 (i,j)(i,j)(i,Y1)(i,Y-1) 均没有鱼,则可以让 jYj\gets Y,此时不影响第 ii 列抓住的鱼,但旁边两列有可能抓住更多的鱼。这样可以把 jj 的有效状态数减少到 O(n+m)O(n+m),结合前面的优化,复杂度 O((n+m)log(n+m))O((n+m)\log (n+m))
然后还有一点常数优化,根据 f(i,j,0/1)f(i,j,0/1) 的定义显然 f(i,j,0)>f(i,j,1)f(i,j,0)>f(i,j,1)I\mathrm{I} 可以把 f(i1,j,1)f(i-1,j,1) 部分删去,V\mathrm V 也可以删去。

评论

0 条评论,欢迎与作者交流。

正在加载评论...