萌新玄关求教关于块长
  • 板块P3863 序列
  • 楼主lzyqwq
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/11/8 22:04
  • 上次更新2023/11/9 10:05:32
查看原帖
萌新玄关求教关于块长
539211
lzyqwq楼主2023/11/8 22:04

rt,此题修改个数 O(n+q)\mathcal{O}(n+q),询问个数 O(q)\mathcal{O}(q)。

设块长为 BB。

事实上修改可以通过归并排序做到单次 O(qB+B)\mathcal{O}\left(\dfrac{q}{B}+B\right),查询单次复杂度为 O(qlog⁡qB+B)\mathcal{O}\left(\dfrac{q\log q}{B}+B\right)。

显然,当 BB 取 qlog⁡q\sqrt{q\log q} 时,修改和查询的复杂度均为 O(qlog⁡q)\mathcal{O}(\sqrt{q\log q}),这样总时间复杂度为 O((n+q)qlog⁡q)\mathcal{O}((n+q)\sqrt{q\log q})。

但是实测跑得很慢。

但是当 BB 取 q\sqrt{q} 时,修改的复杂度是 O(q)\mathcal{O}(\sqrt{q}),查询的复杂度是 O(qlog⁡q)\mathcal{O}(\sqrt{q}\log q),总时间复杂度为 O(nq+qqlog⁡q)\mathcal{O}(n\sqrt{q}+q\sqrt{q}\log q)。

结果跑得更快了。

请问这是为什么?是我算错了吗,还是有更优的块长。

如果是啥“理论和实际另当别论”,那我没啥好说的。

谢谢 qwq。

2023/11/8 22:04
加载中...