2022noipP8865 [NOIP2022] 种花

题目大意:
给出T个n*m大小的01图,1表示不合法点,求出图中c和f的个数,其中c的长度至少为1,f是c的长度+n
思路:前缀和

解法一:复杂度O(Tn{_{}}^{3})

处理每一行的后缀和,s[i][j]表示第i行后面j行的连续长度,其中,有f[i][j]=f[i][j+1]or0

然后枚举c的两个关键点i,j,k  (i,j) (k,j)两点后的贡献,则答案是s[i][j]*s[k][j],其中k-i>=2,且a[k][j]!=0,在k上恒成立

f的贡献是后面行的连续0个数-1+c的个数,保证0个数不为0

解法二:优化前缀和,复杂度O(Tn^{2})

同上处理后缀和,在每一列上,f是前面c凭借而成,这些c的一横与f[i][j]做乘积即可。

lclf两个值表示点(i,j)作为下面的贡献点的贡献,则有lc=\sum f[i-1][j]lf=f[i][j]*lc,所以答案是ansc=\sum lc*f[i][j]ansf=\sum lf

也可以推出以下柿子:ansc=f[i][j]*(f[i+2][j]+f[i+3][j]+f[k][j]),满足i+1 - k恒不为0,则ansf=nowc*g[i][j],是后面0的连续个数。同时维护一个f[i][j]的前缀和

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值