[codeforces761F] Dasha and Photos

昨晚打的cf,都把F切了,结果不计rating…

题目大意

给定k个n*m的由小写字母组成的矩阵(给定方式:先给定一个n *m的最初矩阵,然后k个矩阵对应5个参数a,b,c,d,e,其中(a,b)是左上角,(c,d)是右下角,然后把原矩阵的这个子矩阵的字符全部改成e)。两个矩阵的距离定义为对应每个位置字符相减之差的和。问:k个矩阵中到所有其它矩阵最小的距离和。

n,m≤1000 k≤300000

思路

n*m不大,所以可以尝试对每一位都预处理出填每个字符的答案。

首先把k个矩阵在行a,c处打插入、删除标记。由于覆盖的部分是个矩形,列对应的是一个区间。

我比赛时的naive做法

开26个线段树对应每个小写字母,然后插入、删除就是区间加减。计算每个点的答案时,先在26个线段树里单点查询,取出每种字母对应的答案(注意有些矩阵中不覆盖掉当前点,就要把原矩阵的字母算上)。然后枚举填的字母,直接计算即可。
接下来是统计答案:对填每种字母、原矩阵已经求出来每一位的答案,做一个二维前缀和,然后枚举k个矩阵,在原矩阵的答案上减去覆盖掉矩形的答案,再把填上对应字母的答案加上,就得到了该矩阵的答案了。

时间复杂度 O(26nmlogm) ,可以通过所有数据。

更快的做法

log其实可以去掉。
对于每个矩形的参数a,b,c,d,对应的字符中,在(a,b)、(c+1,d+1)处打+1标记,(c+1,b)、(a,d+1)处打-1标记。然后求前缀和。可以发现,对于任意一个矩形的前缀和,如果在矩形内部,它正好+1,否则为0。
接下来就是枚举每个位置的字母,然后二维前缀和。

时间复杂度 O(

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值