首页 > 其他分享 >【学习笔记】莫队

【学习笔记】莫队

时间:2024-11-08 20:22:32浏览次数:1  
标签:rd int sum 笔记 学习 ++ bool 莫队

【学习笔记】莫队

普通莫队

形式

假设 \(n=m\),那么对于序列上的区间询问问题,如果从 \([l,r]\) 的答案能够 \(O(1)\) 扩展到 \([l-1,r],[l+1,r],[l,r+1],[l,r-1]\)(即与 \([l,r]\) 相邻的区间)的答案,那么可以在 \(O(n \sqrt{n})\) 的复杂度内求出所有询问的答案。

解释

离线后排序,顺序处理每个询问,暴力从上一个区间的答案转移到下一个区间答案(一步一步移动即可)。

排序方法

对于区间 \(l,r\) , 以所 \(l\) 在块的编号为第一关键字, \(r\) 为第二关键字从小到大排序。

例题

SDOI2009 HH的项链

优化 \(1\) :重新赋编号,数据可能相同值比较集中,所以加上这个优化直接从 44pts 变成 84pts。

优化 \(2\) :区间移动的代价不要写成函数 adddel,用 bool 压一下行,巨快。96pts。

优化 \(3\) :奇偶性排序。因为根据莫队排序后点对 \((l, r)\) 的分布大概长这样(如右图),但我们可以继续优化:奇数块按 \(r\) 递增,偶数块按 \(r\) 递减,这样横坐标在块内移动的代价是 \(O(\sqrt{n})\),但纵坐标不会出现忽上忽下的情况。这个优化有通用性而且优化巨大。100pts。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
char buf[100], *p1 = buf, *p2 = buf, obuf[80000000], *o = obuf;
inline int gc(){
	return (p1 == p2) && (p2 = (p1 = buf) + fread(buf, 1, 100, stdin), p1 == p2) ? EOF : *p1 ++;
}
inline int rd(){
	int x = 0; char ch;
	while(!isdigit(ch = gc()));
	do x = (x << 3) + (x << 1) + (ch ^ 48); while(isdigit(ch = gc()));
	return x;
}
inline void write(int x){
	if(x > 9) write(x / 10);
	*o++=(x % 10 + 48);
}
const int N = 1e6 + 5;
int cnt[N], a[N], from[N], ans[N];
int n, m, nw = 0, block, sum = 0;
struct node{
	int id, l, r;
	bool operator < (const node &o)const{
		int ls = (l - 1) / block + 1, rs = (o.l - 1) / block + 1;
		return (ls == rs) ? ((ls & 1) ? r < o.r : r > o.r) : ls < rs;
	}
}q[N];
signed main(){
	n = rd();
	F(i, 1, n){
		a[i] = rd();
		if(!from[a[i]]) from[a[i]] = ++ nw;
		a[i] = from[a[i]];
	}
	m = rd();
	F(i, 1, m) q[i].id = i, q[i].l = rd(), q[i].r = rd();
	block = m / __builtin_sqrt(n);
	sort(q + 1, q + m + 1);
	int L, R, l = 1, r = 0;
	F(i, 1, m){
		L = q[i].l, R = q[i].r;
		while(l > L) sum += !(bool) cnt[a[-- l]] ++;
		while(r < R) sum += !(bool) cnt[a[++ r]] ++;
		while(l < L) sum -= !(bool) -- cnt[a[l ++]];
		while(r > R) sum -= !(bool) -- cnt[a[r --]];
		ans[q[i].id] = sum;
	}
	F(i, 1, m) write(ans[i]), *o++='\n';
	return fwrite(obuf, o - obuf, 1, stdout), fflush(0), 0;
}

参考博客:

普通莫队算法 - OI Wiki

莫队算法——从入门到黑题 - WAMonster

标签:rd,int,sum,笔记,学习,++,bool,莫队
From: https://www.cnblogs.com/superl61/p/18029948

相关文章

  • 2024-2025-1 20241407《计算机基础与程序设计》第七周学习总结
    这个作业属于哪个课程[2024-2025-1计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里2024-2025-1计算机基础与程序设计第七周作业这个作业的目标学习数组与链表,基于数组和基于链表实现数据结构,无序表与有序表,树,图,子......
  • 【Docker 入门学习】
    Docekr基础知识一、docker安装与卸载二、Docker基础知识1.dockerrun过程2.docker是怎么工作的?3.docker为什么比VM快?5.docker命令a.帮助命令b.镜像命令c.容器命令6.Docker镜像理解7.commit镜像简介:Docker是基于go开发的开源项目。......
  • 学习日志007--python函数 学完再练习练
    一、函数的概念1.定义函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。2.作用函数能提高应用的模块性,和代码的重复利用率3.定义函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用......
  • 【论文阅读笔记】Transformer——《Attention Is All You Need》
    论文地址:https://arxiv.org/pdf/1706.03762代码地址:https://github.com/huggingface/transformers目录IntroductionBackgroundModelArchitectureEncoderLNandBNDecoderAttentionMulti-headAttentionFeed-ForwardPostionEncodingWhyself-attentionIntroductionRNN,L......
  • 【论文阅读笔记】Transformer——《Attention Is All You Need》
    论文地址:https://arxiv.org/pdf/1706.03762代码地址:https://github.com/huggingface/transformers目录IntroductionBackgroundModelArchitectureEncoderLNandBNDecoderAttentionMulti-headAttentionFeed-ForwardPostionEncodingWhyself-attentionIntroductionRNN,L......
  • Vscode写笔记上传博客园
    Vscode上传博客园博客前面写了一个Typora上传图片的,我发现离线状态下的话,还是有一些图片看不了,问了其他师傅,决定用Vscode上传博客园的方式,刚刚成功,现在写一个博客来简单记录一下。1.下载Vscode(自己下,网上到处教程)2.下载相关插件3.配置你的博客来到这个页面就是配置成功......
  • 第二周学习笔记Linux:Linux用户权限管理 |文本处理|shell基础
    用户权限命令以及ACL权限相关命令1.Linux安全模型资源分派:Authenticaton:登陆认证,验证用户身份Authorization:授权,不同的用户设置不同权限Accouting:审计,检查用户的时候行为即Linux的AAA认证,是针对网络设备的网络访问控制策略和安全模型1用户Linux是多系统用户,可以......
  • 《计算机基础与程序设计》第七周学习总结
    如2024-2025-7)20241404《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标<数组与链表基......
  • KMP学习笔记
    复习了一下KMP。与其说是复习,不如说是重学了一遍。学习KMP实际上就是学习了前缀函数。下文大抵把OI-Wiki上关于前缀函数和KMP的部分内容说了一下。前缀函数定义给定一字符串,对于它的每个前缀\(s[0,i-1]\),存在该子串的真前缀与真后缀相同,其中最大的一对前后缀的长度,记作:\[\lar......
  • 2025年入门深度学习或人工智能,该学PyTorch还是TensorFlow?
    随着2025应用人工智能和深度学习技术的举世泛气,还在迷茫于该选择哪个深度学习框架吗?PyTorch和TensorFlow是并立于深度学习世界两座巨塔,但是越来越多人发现,在2025年,PyTorch似乎比TensorFlow更为流行和被接受。下面我来分析一下这两个深度学习框架的发展历史,应用差异和现状,以......