题意
一个 1 0 6 10^6 106行 1 0 6 10^6 106列的网格图,上面有一些牛、花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,不能穿过围栏和地图边界,求每头牛它能到达的花的数量。(栅栏不会相交)
题解
暴力
首先,可以想出一个很显然的dp,设 d p i , j dp_{i,j} dpi,j表示方格 ( i , j ) (i,j) (i,j)能到达的花数。要分类讨论,前三种情况很简单,再次不赘述,特别地,有一种情况不能忽略,如下图:(红色范围为栏杆,蓝色为当前格)
如果 d p i , j = d p i + 1 , j + d p i , j + 1 dp_{i,j}=dp_{i+1,j}+dp_{i,j+1} dpi,j=dpi+1,j+dpi,j+1,会发现黑色部分重复计算,需要减去围栏左下角的 d p dp dp值。
时间复杂度 O ( n 2 ) O(n^2) O(n2),需要优化
优化
我们发现除了有围栏遮挡的情况外,当前状态的更新都用到 d p i + 1 , j dp_{i+1,j} dpi+1,j和 d p i , j + 1 dp_{i,j+1} dpi,j+1,可以考虑差分:
我们可以按 y y y从大往小扫描线,维护数组 f i f_i fi,表示第y列中(注意题目中的y是横坐标) d p i , y − d p i + 1 , y dp_{i,y}-dp_{i+1,y} dpi,y−dpi+1,y的值。可以画个图帮助理解:
如上图 f 1 f_1 f1统计范围是蓝色部分, f 2 f_2 f2也是它对应的横条, f 3 f_3 f3统计围栏内,而 f 4 f_4