花海

花海

模拟6 T1

显然又是一道场切不了的T1。虽然考场貌似好像可能自我感觉有点思路,但是显然是错的。而且吃一堑吃一堑,昨晚的教训还没吸取,首先把题意错看成子方阵的最大和,然后又漏看了长宽至少为2的条件。眼睛可以捐了。

题意

给定一个各个点带权的方阵,求问这个方阵中能围成一个大于\(2*2\)四条边的边权和的最大值是多少。

首先看数据范围直接存[maxn][maxn]显然会炸。但观察到\(m*n<=2*10^5\),令\(n>=m\),则m之多是\(\sqrt{25}\),开得下。

如果\(n<m\),则输入时存数组就要存[j][i]并且交换\(n\),\(m\),反之存[i][j]。

\(b\)数组是每一行的前缀和,是枚举每一行时的双列前缀和,\(maxx\)是上面选的最优一行减去(上面选的一行)双列前缀和的最大值。如图,蓝色部分减去绿色部分就是\(maxx\)。容易得出当前行的前缀和加上双列前缀和\(lsum\)(不包括当前行的两个位置)加上\(maxx\)正好等于该矩形的四边。\(lsum\)\(maxx\)等价于当前最优的行减去1到该行的双列前缀和加上当前位置的双列前缀和,该方案下双列前缀和不被包含的部分正好抵消。主要就是这里难以理解。如果当前行算出的\(maxx\)比实际\(maxx\)更大说明以当前行作为\(maxx\)更优,更新\(maxx\)。画几个图推推就推出来了

代码实现

(确实得抓紧提升能力了qwq)

posted @ 2025-08-09 15:41  _dlwlrma  阅读(7)  评论(0)    收藏  举报