【BZOJ4422】Cow Confinement【扫描线】【差分】【线段树】

这篇博客介绍了BZOJ4422题目的解题思路,主要涉及扫描线算法和差分优化。作者首先阐述了题目的背景和暴力解法,然后详细讲解了如何通过差分优化将时间复杂度降低,利用线段树维护单点修改、区间复制、区间求和以及标记处理,从而解决牛和花之间的可达性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

一个10610^610610610^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,jdpi,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,ydpi+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_ixiRfi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值