首页 > 其他分享 >普通莫队

普通莫队

时间:2023-07-24 17:14:26浏览次数:37  
标签:node int 普通 maxn 答案 莫队 size

普通莫队

形式

如果从\([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']\),我们就可以移动左右指针,从而计算出答案

但是这可以被卡到\(O(n)\)

因此我们考虑进行离线处理

我们对\(l\)的数值进行分块,一共分成\(\sqrt n\)段,每一段的编号相同

第一关键字是段的编号,第二关键字是右端点的编号

然后我们就可以暴力了

时间复杂度

参考普通莫队算法 - OI Wiki (oi-wiki.org)

细节问题

1,\(l\)要为1,\(r\)要为0

2,分块时注意第一关键字,分不好就会TLE

3,询问间区间的转移,我们最好先扩大区间,再缩小区间,避免出现问题

2339 Toys "R" Us - PCOI Online Judge (pcoij8.ddns.net)

题目大意

询问\([l,r]\)中第一个没有出现的正整数

做法

一眼莫队,对于寻找第一个没出现的正整数,我们考虑用set查询

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int cnt[maxn],a[maxn],ans[maxn];
set<int>Set;
int n,m,l,size;
struct node{
	int x,y,id;
}q[maxn];
bool cmp(node x,node y){
	if(x.x/size==y.x/size)return x.y<y.y;
	return x.x/size<y.x/size;
}
void update(int now,int whi){
	if(whi==1){
		cnt[a[now]]++;
		if(cnt[a[now]]==1){
			Set.erase(a[now]);
		}
	}
	else{
		cnt[a[now]]--;
		if(!cnt[a[now]])
			Set.insert(a[now]);
	}
}
int main(){
	for(int i=1;i<=100001;i++)Set.insert(i);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i].id=i;
	}
	size=sqrt(m);
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		int ql=q[i].x,qr=q[i].y;
		while(r<qr)update(++r,1);
		while(r>qr)update(r--,-1);
		while(l>ql)update(--l,1);
		while(l<ql)update(l++,-1);
		ans[q[i].id]=*Set.begin();
	}
	for(int i=1;i<=m;i++){
		printf("%d\n",ans[i]);
	}
	
	
	return 0;
}

标签:node,int,普通,maxn,答案,莫队,size
From: https://www.cnblogs.com/Ayaka-T/p/17577737.html

相关文章

  • 视网膜New iPad与普通分辨率iPad页面的兼容处理
    一、这是篇经验分享 就算不是果粉也应该知道,iPad2与newiPad的重大区别之一就是显示屏的分辨率。newiPad显示屏被称之为“视网膜显示屏”,其设备分辨比(之前有详细介绍,点击这里查看)是iPad2的两倍。–iPadmini也是普通分辨比。 iPad2与newiPad同时显示一个页面,宽度都是1024像素......
  • Linux系列---【linux使用sudo命令管理普通用户执行root权限】
    linux使用sudo命令管理普通用户执行root权限为什么要用sudo?sudo提供了一种安全而灵活的方式,让普通用户在需要时以root用户的身份执行特权操作,同时也提供了更好的管理和安全性。通过合理配置sudoers文件,可以确保只有受信任的用户能够执行特权操作,从而保护系统的完整性和安......
  • 莫队学习
    大致思路: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......
  • 北京普通中学、小学、幼儿园查询网址---普通中学、北京小学、幼儿园大全
    北京幼儿园查询的网址--北京幼儿园大全 http://www.bjedu.gov.cn/bjedu/78535942318587904/index.shtml 北京小学查询的网址http://www.bjedu.gov.cn/bjedu/78535938023620608/index.shtml北京普通中学查询的网址http://www.bjedu.gov.cn/bjedu/78535933728653312/index.sh......
  • idea java文件夹变普通了
    从Idea的java文件夹变普通了最近的Idea更新带来了一些改变,其中之一是将"java"文件夹从特殊文件夹变成了普通文件夹。这意味着我们可以在项目中像其他文件夹一样自由地添加、删除和管理"java"文件夹。在本文中,我们将讨论这一变化的原因以及如何适应这一变化。变化的原因在旧版本......
  • 面向普通用户和开发者的ChatGPT Prompt Engineering 终极指南
    你准备好发掘ChatGPT的全部潜力了吗?想象一下拥有一个AI工具,它能在很多方面帮助你——从回答问题和创作有趣内容到提供个性化建议。这就是「PromptEngineering」的用武之地——一种有效且强大的方法,通过精心创建Prompt和指导,让ChatGPT的工作更出色。在这篇文章中,我......
  • get请求与post请求发送普通参数
        ......
  • 莫队
    简介用于解决一类离线区间询问问题。将其加以扩展,便能轻松处理树上路径询问以及支持修改操作。普通莫队算法概述对于序列上的区间询问问题,如果从\([l,r]\)答案能够\(O(1)\)扩展到\([l-1,r],[l+1,r],[l,r+1],[l,r-1]\)(即与\([l,r]\)相邻的区间)的答案,那么......
  • 95.静态成员与普通成员的区别是什么?
    95.静态成员与普通成员的区别是什么?1.生命周期静态成员变量从类被加载开始到类被卸载,一直存在;普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命期结束;2.共享方式静态成员变量是全类共享;普通成员变量是每个对象单独享用的;3.定义位置普通成员变量存储在栈或堆中,而......
  • 莫队学习笔记
    这是一篇模仿算导的学习笔记/题解。例题:P1494给定一个长为\(n\)的数组\(a\)和\(m\)个询问(有序数对)\(b_i=(l_i,r_i)\),询问允许离线,对每个询问\((l,r)\)求出满足\(l\lei\ltj\ltr\wedgea_i=a_j\)的数对\((i,j)\)数量.证明:若数\(x\)在\(a\)数组下标为......