题意
一个10610^6106行10610^6106列的网格图,上面有一些牛、花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,不能穿过围栏和地图边界,求每头牛它能到达的花的数量。(栅栏不会相交)
题解
暴力
首先,可以想出一个很显然的dp,设dpi,jdp_{i,j}dpi,j表示方格(i,j)(i,j)(i,j)能到达的花数。要分类讨论,前三种情况很简单,再次不赘述,特别地,有一种情况不能忽略,如下图:(红色范围为栏杆,蓝色为当前格)
如果dpi,j=dpi+1,j+dpi,j+1dp_{i,j}=dp_{i+1,j}+dp_{i,j+1}dpi,j=dpi+1,j+dpi,j+1,会发现黑色部分重复计算,需要减去围栏左下角的dpdpdp值。
时间复杂度O(n2)O(n^2)O(n2),需要优化
优化
我们发现除了有围栏遮挡的情况外,当前状态的更新都用到dpi+1,jdp_{i+1,j}dpi+1,j和dpi,j+1dp_{i,j+1}dpi,j+1,可以考虑差分:
我们可以按yyy从大往小扫描线,维护数组fif_ifi,表示第y列中(注意题目中的y是横坐标)dpi,y−dpi+1,ydp_{i,y}-dp_{i+1,y}dpi,y−dpi+1,y的值。可以画个图帮助理解:
如上图f1f_1f1统计范围是蓝色部分,f2f_2f2也是它对应的横条,f3f_3f3统计围栏内,而f4f_4f4则统计黄色部分,一个“7”形。
这样,要统计某一头牛(x,y)(x,y)(x,y)能到达的花,只需找出第一个挡住它的围栏横坐标(R),答案就是∑x≤i≤Rfi\sum_{x\leq i\leq R}f_i∑x≤i≤Rfi