以下总结参考了许多大佬们的博客,开篇先(大佬)%

莫队的入门题目主要为莫队和带修莫队在,这里就先在这里总结一下这两类题目的一些属性。

我认为莫队本质是一种比较优化的暴力查找法。在通过分块操作后把复杂度降低。这个降低的复杂度的大小主要和你分块的方法有着巨大的关系。

普通的莫队,n个元素m个区间询问,他的最佳分块大小为  n/√m   ,如果默认n==m的话  复杂度会降到 O(n*√n)  即可以完美运行5X10e5数据。

带修的莫队,多加了一个让指针移动的因子—时间 t  ,时间复杂度比较难求,如果设定n,m,t相等的情况下 复杂度O(nlogn+n5/3),同样可以运行50000数据。

贴两道经典的莫队存板子。

P1494 [国家集训队]小Z的袜子 https://www.luogu.org/problemnew/show/P1494

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll b,ans=0;int l=1,r=0;
ll gcd(ll a,ll b)
{if(b==0) return a;else return gcd(b,a%b);
}
struct dd
{int x,y,num;
}a[50050];
ll cmp(dd x,dd y)
{if(x.x/b==y.x/b) return x.y<y.y;else return x.x<y.x;
}
ll bj[50050]={0};
ll c[50050];
pair<int,int> pr[50050];
void solve(int x,int add)
{ans-=bj[c[x]]*bj[c[x]];//cout<<ans<<endl;bj[c[x]]+=add;ans+=bj[c[x]]*bj[c[x]];//cout<<ans<<endl;
}
int main()
{ll n,m,q,i,j;scanf("%lld%lld",&n,&q);b=sqrt(n);for(i=1;i<=n;i++) scanf("%lld",&c[i]);for(i=1;i<=q;i++) scanf("%d%d",&a[i].x,&a[i].y),a[i].num=i;sort(a+1,a+q+1,cmp);for(i=1;i<=q;i++){ll lon=a[i].y-a[i].x+1;//cout<<a[i].x<<" "<<a[i].y<<"lon="<<lon<<endl;while(l<a[i].x){solve(l,-1);l++;}while(l>a[i].x){solve(l-1,1);l--;}while(r<a[i].y){solve(r+1,1);r++;}while(r>a[i].y){solve(r,-1);r--;}//cout<<l<<" "<<r<<endl;int aans=ans-lon;lon=lon*(lon-1);int gc=gcd(aans,lon);//cout<<ans<<" "<<lon<<endl;if(aans==0) pr[a[i].num].first=0,pr[a[i].num].second=1;else pr[a[i].num].first=aans/gc,pr[a[i].num].second=lon/gc;}for(i=1;i<=q;i++) printf("%d/%d\n",pr[i].first,pr[i].second);
}

P1903 [国家集训队]数颜色 / 维护队列 https://www.luogu.org/problemnew/show/P1903

#include<bits/stdc++.h>
using namespace std;
int ans=0;int l=1,r=0,t=0;
int b;
struct dd
{int x,y,t,num;
}a[50050];
struct dt
{int p, v;
}tw[50050];
int cmp(dd x,dd y)
{if(x.x/b==y.x/b){if(x.y/b==y.y/b) return x.t<y.t;return x.y/b<y.y/b;} else return x.x<y.x;
}
int bj[1000050]={0};
int e=0,tim=0;
int c[50050];
int pr[50050];
void solve(int x,int add)
{bj[c[x]]+=add;if(bj[c[x]]==0&&add==-1) ans--;if(bj[c[x]]==1&&add==1) ans++;//cout<<ans<<endl;
}
void time_change(int i,int tt)
{if(tw[tt].p>=a[i].x&&tw[tt].p<=a[i].y) {bj[c[tw[tt].p]]--;if(bj[c[tw[tt].p]]==0) ans--;bj[tw[tt].v]++;if(bj[tw[tt].v]==1) ans++;}swap(tw[tt].v,c[tw[tt].p]);
}
int main()
{int n,q,i;char qq[5];scanf("%d%d",&n,&q);b=pow(n,0.66666);for(i=1;i<=n;i++) scanf("%d",&c[i]);for(i=1;i<=q;i++) {scanf("%s",qq);if(qq[0]=='Q'){e++;scanf("%d%d",&a[e].x,&a[e].y);a[e].t=tim;a[e].num=e;}else{tim++;scanf("%d%d",&tw[tim].p,&tw[tim].v);}}sort(a+1,a+e+1,cmp);for(i=1;i<=e;i++){//cout<<a[i].x<<" "<<a[i].y<<"lon="<<lon<<endl;while(l<a[i].x){solve(l,-1);l++;}while(l>a[i].x){solve(l-1,1);l--;}while(r<a[i].y){solve(r+1,1);r++;}while(r>a[i].y){solve(r,-1);r--;}//cout<<l<<" "<<r<<endl;while(t<a[i].t){time_change(i,t+1);t++;}while(t>a[i].t){time_change(i,t);t--;}//cout<<ans<<" "<<lon<<endl;pr[a[i].num]=ans;}for(i=1;i<=e;i++) printf("%d\n",pr[i]);
}

转载于:https://www.cnblogs.com/wsblm/p/10813007.html

莫队+带修莫队模板与总结相关推荐

  1. 莫队算法学习笔记(二)——带修莫队

    前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...

  2. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  3. 牛客练习赛85 数学家的迷题 (带修莫队/线段树)

    题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...

  4. HDU - 6610 Game(带修莫队)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a,sum 为数列 a 的前缀异或和,再给出 m 次操作,每次操作分为两种类型: 1 l r:询问 sum 在区间 [ l , r ] 内有多 ...

  5. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  6. 带修莫队 的 小优化 (针对yxc版本)

    带修莫队模板题 请大佬出门右转 y总进阶课有一道类似的题,我把进阶课的代码交上去发现t了好几个点,我以为我代码常数大,我把y总的代码交上去之后,一直被卡一个点没过. #include <iost ...

  7. 莫队和带修莫队 学习笔记

    哎,很纠结,我刚学这个东西,感觉好像本身自己理解得就不深刻,所以好像不知道该怎么写这个学习笔记了,估计是我思路最凌乱,语言最没逻辑的一篇学习笔记吧.(如果看到这儿觉得作者会坑就关掉吧..) 好,我来尝 ...

  8. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)

    LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...

  9. 牛客挑战赛48E-速度即转发【带修莫队,分块】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列,mmm个操作. 给出l,r,kl,r,kl,r,k,求一个 ...

最新文章

  1. cookie自动登录
  2. 如何刪除GitHub中的repository
  3. 2018蓝桥杯省赛---java---B---4(测试次数)
  4. 使用NoSQL实现实体服务–第4部分:Java EE
  5. 使用IntelliJ IDEA碰到的问题总结
  6. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景
  7. golang atomic load 性能_设计模式之Golang单例模式
  8. GenseeSDK DocView(OpenGL)引起的TextView显示黑块
  9. 利用数据库来填充UltraWebTree
  10. 膝盖中了一箭之康复篇-第九个月暨3月份目标总结
  11. 华为销售用一封邮件撬走阿里云千万级客户罗振宇的《得到》
  12. linux安装smmo压缩包软件,Linux centos 安装rarlinux压缩软件 使有rarlinux
  13. mac os模拟器linux,Mac系统如何启动iOS模拟器 快速启动iOS模拟器教程
  14. 计算机矩阵入门(eigen)0XC000041D
  15. DataStructuresAndAlgorithm--字谜游戏
  16. 数据结构(C语言版)-- 数据结构基础
  17. Clouda 之我见
  18. 闲鱼互动玩法标准化建设
  19. 2015年11月小结
  20. html简单边框制作--特效文字制作及代码,HTML音画介绍之一--基本原理和边框的制作...

热门文章

  1. android:intent flags
  2. MySQL修改数据表(ALTER TABLE语句)
  3. 158行代码!程序员复现DeepMind图像生成神器
  4. word中将半角标点符号(如双引号等)转换为全角
  5. 源码 linux下编译_Linux云服务器软硬链接及源码编译安装python3.8的一些备注
  6. SPringMVC使用总结
  7. java 接口中 常量_讨论:Java 接口当中的 “常量接口”
  8. java怎么输出集合_Java 输出集合中的元素
  9. html中加载解析,HTML页面加载和解析流程详细介绍
  10. hive表 合并字段_hive 两字段合并成 一个字段 例如:字段a和字段b合并成a-b,请问如何实现、...