首页 > 其他分享 >重拾莫队的一点儿思考

重拾莫队的一点儿思考

时间:2023-08-26 10:56:28浏览次数:28  
标签:frac 分块 复杂度 sqrt 次数 端点 一点儿 重拾 莫队

发现在过去一年里好多东西都忘光了,于是全部重来。

对于最简单的一个莫队情景:序列长度为 \(n\),有 \(q\) 次询问,插入、删除复杂度均为 \(O(1)\)。

我们把询问按照左端点排序,然后分块,每一块内再按照右端点来排序……等一等?

考虑一下两种不同的分块方式。

第一种,把原序列按 \(B\) 分块,再将询问按照左端点所在块进行分块。

此时每一块内右端点移动次数为 \(O(n)\) 级别,右端点总移动次数为 \(O(\frac{n^2}{B})\) 级别;

左端点的总移动次数是 \(O(qB)\) 级别。

总复杂度 \(O(\frac{n^2}{B}+qB)\),当 \(B\) 取 \(\frac{n}{\sqrt q}\) 时平衡复杂度为 \(O(n\sqrt q)\)。

第二种,把询问按 \(B\) 均匀分块。

此时每一块内右端点移动次数仍为 \(O(n)\) 级别,右端点总移动次数为 \(O(n\frac{q}{B})\) 级别;

左端点的总移动次数是 \(O(nB)\) 级别。

总复杂度 \(O(n\frac{q}{B}+nB)\),当 \(B\) 取 \(\sqrt q\) 时平衡复杂度为 \(O(n\sqrt q)\)。

也就是说这两种分块方式的最优复杂度都是 \(O(n\sqrt q)\)。有趣的是对于第二种,最优块长与 \(n\) 无关。

不过这些分析也没啥用处,实际做题的时候还是直接硬调吧。

标签:frac,分块,复杂度,sqrt,次数,端点,一点儿,重拾,莫队
From: https://www.cnblogs.com/LFCode/p/xjb-think-about-modui.html

相关文章

  • 开源知识付费系统源码:兔知云课堂助力广州客户重拾小程序信心
    广州的一位小伙伴,以一颗奥特曼的心,寻求了兔知云课堂的帮助,成功实现了他的小程序梦想。这个奥特曼不是战斗在城市高楼大厦的巨人,而是一个充满创意和梦想的创业者。他的头像就是奥特曼,让人忍不住发笑,同时也引发了一些疑虑。但最终,这个奥特曼成功地与兔知云课堂达成合作,完成了他的麦......
  • 莫队学习笔记
    学习莫队是非常有必要的众所周知,莫队是一种优越的暴力算法,当我们在\(NOIP\)等考试中数据结构不会打且问题是离线时,我们就可以:莫队,启动!好,切入正题,我们现在来看看莫队是什么:例题传送门简要题意:给定一个长度为\(n\)的序列\(a\),然后再给一个数字\(k\),再给出\(m\)组询问,每......
  • 回滚莫队 学习笔记
    板子题交\(998244353\)遍一直UKE我哭死。回滚莫队有些题看起来像个莫队,想着想着发现add操作很容易实现,而del操作怎么都想不出来,或者是del操作时间复杂度不是\(O(1)\)时间复杂度爆炸,那么回滚莫队就能派上用场。这种莫队不带删因此也叫做不带删莫队。AT_joisc2014_c......
  • Gym103687D The Profiteer:回滚莫队信息双指针可以做到线性对数
    标题写得好所谓的回滚莫队信息意思是,设信息保存在两个大小分别为\(a,b\)的结构上,将这两个信息进行合并得到大小为\(a+b\)的信息需要的时间为\(\Omega(\min\{a,b\}\cdotf(n))\);而给定一个大小为\(1\)的信息,可以在\(\mathrmO(f(n))\)时间内将它加入到任何一个结构中......
  • 莫队
    回滚莫队++L一定要独立出来inlinevoidQ(){k=pow(n,0.66);for(inti=1;i<=max(n,m);++i)block[i]=(i-1)/k+1;for(inti=1;i<=q;++i)qwe[i]={read(),read(),read(),read(),i,0};sort(qwe+1,qwe+q+1,cmp);intL=1,R=0,las=0,_l;for(inti=1;i......
  • [Ynoi2016] 这是我自己的发明(根号分治+分块/莫队)
    题目传送门soltion简单题换根显然可以拆成\(O(1)\)个区间,这里先不管。直接做法是莫队,把双子树拆成\(dfs\)序上的双前缀,可以直接莫队,但是常数比较大。另一种做法是根分,对颜色出现次数分治,大于的求出\(dfs\)序的前缀和即可,小于的因为一共只有\(O(n\sqrtn)\)个点对,所以......
  • 普通莫队
    普通莫队形式如果从\([l,r]\)的答案能够$O(1)$扩展到\([l+1,r][l-1,r][l,r+1][l,r-1]\)(即与\([l,r]\)相邻的区间)的答案,那么使用莫队算法可以在\(O(n\sqrtn)\)的复杂度内求出所有询问的答案。核心我们假设已经知道\([l,r]\)的答案,现在我们要求\([l',r']\),我们就可以移动左右指针......
  • 莫队学习
    大致思路:1.分块2.对提问排序3.暴力处理#莫队模板```cpp#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10,M=1e6+10;inta[N],belong[N],bnum,cnt[N];intn,q,len,ans[M];structnode{ intl,r,id;}e[M];boolcmp(nodea,nodeb){ return(belong[a.l]^belong[b......
  • 莫队
    简介用于解决一类离线区间询问问题。将其加以扩展,便能轻松处理树上路径询问以及支持修改操作。普通莫队算法概述对于序列上的区间询问问题,如果从\([l,r]\)答案能够\(O(1)\)扩展到\([l-1,r],[l+1,r],[l,r+1],[l,r-1]\)(即与\([l,r]\)相邻的区间)的答案,那么......
  • 莫队学习笔记
    这是一篇模仿算导的学习笔记/题解。例题:P1494给定一个长为\(n\)的数组\(a\)和\(m\)个询问(有序数对)\(b_i=(l_i,r_i)\),询问允许离线,对每个询问\((l,r)\)求出满足\(l\lei\ltj\ltr\wedgea_i=a_j\)的数对\((i,j)\)数量.证明:若数\(x\)在\(a\)数组下标为......