思路来源

Bzoj-2023 小Z的袜子(hose)_ó-CSDN博客(里面还有几篇不错的莫队讲稿)

bzoj2038: [2009国家集训队]小Z的袜子(hose)_thy的专栏-CSDN博客

莫队……讲稿? « Foreseeable's Blog(莫队讲稿)

知识点

莫队是一种优雅的暴力,由前清华集训队队长莫涛发明

基于分块思想,且[l,r]的答案向[l,r+1],[l,r-1],[l-1,r],[l+1,r]四个相邻状态任意一个转移都是O(1)的

离线思想,将读入排序,按sqrt(n)分块,每sqrt(n)个为一块

排序时,将左端点块号相同的询问放在一个块里,右端点按单增排

对于每个块内相邻的两个询问,每次左右端点移动不会超过根号n,是O(sqrt(n))

块与块间相邻的两个询问,每次左右端点移动不会超过2倍根号n,也是O(sqrt(n))

试想以长度x为一块,[1,x][x+1,2x],最坏就是[1,1]->[2x,2x]

因此,对于m个询问,复杂度为O(msqrt(n))

本来可以通过将[l,r]转化为平面坐标(l,r),通过求曼哈顿最小生成树使得转移和最小,

但是,最坏情况下,曼哈顿最小生成树的复杂度和莫队分块的复杂度是一样的,

相比之下,莫队还好写,所以往往采用莫队算法来写

实现时,分块和下标移动套板子,魔改add函数即可

20220211更新

有个小优化,能让右端点挪动的更少:

1. 排序时,如果两个端点所在块相同

若块是第奇数个,按右端点降序

若块是第偶数个,按右端点升序

例题

以bzoj2038: [2009国家集训队]小Z的袜子(hose)为例

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int n,m,l,r;
int col[maxn];
int pos[maxn];//pos[i]代表i下标所在的块号
ll now[maxn];//now[i]代表颜色i有几只袜子
ll res,len,dom,g;
int sz;//块的大小
ll gcd(ll a,ll b)
{return b?gcd(b,a%b):a;
}
struct node
{int l,r,id;ll ans;
}e[maxn];
bool cmp1(node a,node b)
{if(pos[a.l]==pos[b.l]){if(pos[a.l]&1)return a.r>b.r;else return a.r<b.r;}return a.l<b.l;
}
bool cmp2(node a,node b)
{return a.id<b.id;
}
void add(int pos,int v)
{res-=now[col[pos]]*(now[col[pos]]-1);now[col[pos]]+=v;res+=now[col[pos]]*(now[col[pos]]-1);
}
int main()
{while(~scanf("%d%d",&n,&m)){res=0;for(int i=1;i<=n;++i){ scanf("%d",&col[i]);now[i]=0;}sz=(int)sqrt(n); for(int i=1;i<=n;++i)pos[i]=1+(i-1)/sz;for(int i=1;i<=m;++i){scanf("%d%d",&e[i].l,&e[i].r);e[i].id=i;}sort(e+1,e+m+1,cmp1);l=1;r=0;//[l,r] 初始什么都没有 for(int i=1;i<=m;++i){for(;r<e[i].r;r++)add(r+1,1);for(;r>e[i].r;r--)add(r,-1);for(;l<e[i].l;l++)add(l,-1);for(;l>e[i].l;l--)add(l-1,1);e[i].ans=res;}sort(e+1,e+m+1,cmp2);for(int i=1;i<=m;++i){len=(e[i].r-e[i].l+1);dom=len*(len-1);g=gcd(e[i].ans,dom);e[i].ans/=g;dom/=g;printf("%lld/%lld\n",e[i].ans,dom);}}return 0;
}

莫队算法(知识整理+板子总结)相关推荐

  1. 曼哈顿距离最小生成树莫队算法

    参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...

  2. C++ 莫队算法(转)

    胡小兔的良心莫队教程:莫队.带修改莫队.树上莫队 在开始学习莫队之前,照例先甩一道例题:BZOJ 1878 HH的项链. 题意:求区间内数的个数,相同的数只算一次. 在我关于这道题的上一篇题解中,我使 ...

  3. 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法

    title : 莫队算法 tags : ACM,暴力 date : 2021-10-30 author : Linno 普通莫队 常用操作:分块/排序/卡常/离散化等,直接上板子. luoguP270 ...

  4. NBUT 1457 Sona(莫队算法+离散化)

    [1457] Sona 时间限制: 5000 ms 内存限制: 65535 K 问题描述 Sona, Maven of the Strings. Of cause, she can play the ...

  5. XOR and Favorite Number CF340E 莫队算法

    题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...

  6. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  8. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到 ...

  9. cf D. Powerful array 莫队算法

    D. Powerful array 题意:给定一个序列>>每次查询一个区间>>查询该区间内 出现过的数字*出现的次数的平方 的和 思路:学习莫队的第一题或者说小z的袜子是第一题 ...

最新文章

  1. 手机麦克风声音太大_全民K歌必备利器,得胜PH-125手机K歌麦克风让你轻松拥有好声音...
  2. zcmu-2153(拓扑排序+优先队列)
  3. [html] 写html代码时,如果缺少了结束标签,你如何检测及如何预防?
  4. Lua虚拟机中的数据结构与栈
  5. 50道编程小题目之【质数的个数】
  6. 如果没有云栖大会,中国云计算将要落后多少年?
  7. 控件必须放在具有 runat=server 的窗体标记内 错误解决解决方法
  8. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
  9. 利用wget命令获取FTP资源
  10. 机器人学重点知识点总结
  11. 计算机log是代表什么,Log是什么文件?Log文件可以删除吗?
  12. 【机器学习】完整的机器学习项目演练:第三部分
  13. 30岁张一鸣创业成功秘密武器,OKR“失控”管理法
  14. pytorch 入门教程 常用知识整理
  15. 预告来袭:【豆冰冰】发.售,现.金.抽.奖等你来拿
  16. 3、基于竞速小车 实现 华为hi lens红绿灯识别操作
  17. Bluetooth Core Architecture Blocks----蓝牙核心架构
  18. Firefox人气火红 能否取代龙头IE?
  19. 硬盘的主流技术,最新的硬盘技术
  20. java 给excel添加一列_java操作excel在开始位置添加一列

热门文章

  1. tomcat端口被占用的解决办法
  2. JS任意元素的任意值运动
  3. java基于Springboot+vue的健身房课程预约平台 element
  4. DTCloud-Qweb
  5. Vue slot 详解
  6. Thymeleaf:有关于thyme leaf模板的介绍
  7. 人工智能的过去与未来——萌芽
  8. 计算机工程学院在线教学网,计算机工程学院在线教学经验交流发言摘登
  9. Python3网络爬虫开发实战,Scrapy 爬取新浪微博
  10. 前端使用Vue3、后端使用Django的项目使用Idap认证时如何实现登出效果