花海
花海
显然又是一道场切不了的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)

浙公网安备 33010602011771号