博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法模版]莫队
阅读量:5263 次
发布时间:2019-06-14

本文共 1433 字,大约阅读时间需要 4 分钟。

[算法模版]莫队

莫队是一个极其有意思的玄学算法,常用于暴力骗分。

首先,莫队是通过暴力转移区间来求解答案的。那么显然,完成单组询问复杂度是\(O\left(x^{*}(|r 1-r 2|+|(l1-l2 |))\right.\)。其中\(x\)为每次的转移复杂度。

莫队算法的总复杂度是\(n \sqrt m\)。(虽然我也不知道怎么证的)

莫队的精髓在于将序列分块,块的大小也因题而异。对于不带修的普通莫队,最优分块方法是

1669439-20190731162115146-1427639491.jpg

而对于带修改的莫队,分块方法是:

1669439-20190731162124160-2032665631.png

带修莫队只要添加一个第三关键字——按照时间排序即可。

再介绍一种极其玄学的奇偶优化:

我们只需把

int cmp(query a, query b) {    return belong[a.l] == belong[b.l] ? a.r < b.r : belong[a.l] < belong[b.l];}

换成

int cmp(query a, query b) {    return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);}

即可。

具体原理见:


这里放一道莫队+玄学优化卡常能过的暴力题。

#include
#include
#include
#include
#include
#define maxn 500500using namespace std;int block[maxn],val[maxn],n,m,cnt[1020000],tot,ans[maxn];struct gg { int l,r,id;}q[500500];inline void add(int col) { if(!cnt[col])tot++; cnt[col]++;}inline void del(int col) { if(cnt[col]==1)tot--; cnt[col]--;}inline bool cop(gg x,gg y){return (block[x.l]^block[y.l])?x.l
y.r));}int main() { scanf("%d",&n); for(int i=1;i<=n;i++){scanf("%d",&val[i]);} scanf("%d",&m); int bl=n/sqrt(m*2/3); for(int i=1;i<=n;i++){block[i]=(i-1)/bl+1;} for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;} sort(q+1,q+1+m,cop); int l=1,r=1;cnt[val[1]]++;tot=1; for(int i=1;i<=m;i++) { int tl=q[i].l,tr=q[i].r; while(tl

1669439-20190731162337093-831963743.png

转载于:https://www.cnblogs.com/GavinZheng/p/11277204.html

你可能感兴趣的文章
电子眼抓拍大解密
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
2019春 软件工程实践 助教总结
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
java实现哈弗曼树
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
代码变量、函数命名神奇网站
查看>>