带修莫队 P1903 题解

Part # 0. 前言 \text{Part \# 0. 前言} Part # 0. 前言

这个蒟蒻刚学带修莫队,所以 介绍带修莫队的部分比较简略,大家可以去参考一下 OI-wiki 或者其他大佬的博客:)

本文参考了洛谷题解。

Part # 1. 带修莫队 \text{Part \# 1. 带修莫队} Part # 1. 带修莫队

带修莫队,顾名思义,就是待修改的莫队。

众所周知,普通莫队可以在比较好的时间复杂度内完成一次查询操作,但是不支持修改操作,于是就有了带修莫队。

我们知道,莫队实际上是从[l,r][l+1,r][l-1,r][l,r+1][l,r-1]的转移,而且都是 O ( 1 ) O(1) O(1)的,所以如果我们把中括号改成小括号,那么就是莫队的本质了:
(l,r)->(l-1,r)(l+1,r)(l,r-1)(l,r+1)

在这里插入图片描述
图中四个箭头的移动都是可以 O ( 1 ) O(1) O(1)完成的,那么两点之间的曼哈顿距离就是从一个状态到另一个状态所需要的最小挪动

(不了解曼哈顿距离的同学戳上面加粗字体)

那么对于所有的查询,最快的办法就是在坐标系上找到曼哈顿最小生成树

(其实没有必要会这个因为太麻烦了)

你也许会说:“我不会啊!”

这完全没有关系,因为

我也不会

但是我们并没有必要得到最佳答案,能卡过去就够了。

于是我们采用分块的想法,将其分成(n/sz)个长度为sz的块,在每一个块中按照右端点从小到大来移动

就像这样:

至少这样不会被卡掉……

至于块的大小? n \sqrt n n 呗。

(实际上严谨的说,应该是 n m \dfrac {n}{\sqrt {m}} m n,具体为啥有兴趣的同学可以研究一下,一般来说块的大小 n \sqrt n n <

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值