一道奇怪的贪心题,难点主要在对子矩阵补集的处理上。
题目大意
在一个 $n\times m$ 的矩阵上放置 $k$ 个带点权的点,每个点有一个不能放置的子矩阵,最后一个位置的权值为其上所有点权值和。设 $(i, j)$ 权值为 ${\rm val}(i, j)$,求 $\max\left{\sum\limits_{i,j}\dfrac{\mathrm {val}^2(i,j)-\mathrm {val}(i,j)}{2}\right}$。
$n,m\le 1000$,$1\le k \le 10^5$。
source: 39th Petrozavodsk Programming Camp, Summer 2020; Day 1: Warsaw U Contest, Friday, August 21, 2020.
link: http://qoj.ac/contest/802/problem/1243
思路
注意到 $f(x)=\dfrac{x^2-x}2$ 显然满足 $f(x)+f(y)<f(x+y)$,故应尽量集中点。
首先枚举点 $P$,将所有点放置于点 $P$。接下来我们发现,对于两个相对的大矩阵顶点 $A,B$,任何点不可能同时不能被放置于 $A,B$。再枚举剩下的点优先放的定点 $P_2$,剩下的点放在 $P_2$ 的对边即可。
具体实现时注意可以维护五个二维前缀和:所有子矩阵的权值前缀和、包含四个角的子矩阵的权值前缀和来避免暴力查询。(不知道为什么,大多数人维护了 $16\sim 17$ 个前缀和)
时间复杂度 $\Theta(nm)$,空间复杂度 $\Theta(nm)$。
代码
1 |
|