ural 2114 My craft
题意:
一块麦田,长\(n\),宽\(m\),第\(i\)行,第\(j\)列有\(a(i,j)\)个麦子. 如果在\((x_0,y_0)\)撒一种神奇的药物,对于所有的\((x,y)\)满足\(x_0\leq x,y_0\leq y,x+y\leq x_0+y_0+k\) 里的麦子都会被收割. \(k\)表示当前的风力. 有\(q\)次询问,风力分别为\(k_i\),询问在哪个格子使用神奇药物,能获得最多的麦子. 输出格子和收获.
\(1\leq n,m\leq 500\)
\(0\leq a(i,j)\leq 10^9\)
\(1\leq q\leq 50\)
\(1\leq k_i\leq 10^5\)
题解:
如果在\((x,y)\)使用药物,最后能收获的区域是一个等腰直角三角形. 猜时间复杂度是\(O(qn^2)\). 需要\(O(n^2)\)地求出每个把药物撒在每个格子能获得的收益. 用\((x,y)\)的收益推出\((x,y+1)\)的收益,区域的变化是少了左边以\((x,y)\)为上顶点长度为\(k+1\)的一列,多了以\((x,y+1+k)\)为长度为\(k+1\),最右边的点,斜的连续格子. 可以通过预处理\(O(n^2)\)地求出. 但是,\((x,0)\)的格子还是需要暴力求,考虑用\((x,y)\)推\((x+1,y)\),少了以\((x,y)\)为左边的点,长度为\(k\)的一行,多的是以\((x+1,y)\)为最右边的点,长度为\(k+1\)的斜着的连续格子. 此时就可以\(O(n^2)\)地求出所有格子的收益. 最后比较大小就可以了.
这个题目还有一个细节,就是斜着连续格子,\((x,y+1+k)\)这个是需要不仅仅求出所有\(n\times m\)的格子上的,而是\((n+k+1)\times (m+k+1)\)的格子.
时间复杂度: \(O(kn^2)\)
空间复杂度: \(O(n^2)\)

浙公网安备 33010602011771号