BZOJ 3585 mex 莫队算法+分块

该博客介绍了如何使用莫队算法结合分块技术来解决BZOJ 3585问题,即在长度为n的数组上处理m次区间mex值查询。博主分享了如何实现修改操作的常数时间复杂度,并解释了在查询时如何通过扫描和块内暴力查找实现O(√n)的时间复杂度,最终达成总时间复杂度O(m√n)的解决方案。
摘要由CSDN通过智能技术生成

题目大意:给定一个长度为n的数组,m次询问某个区间内的mex值

怒写莫队233

将权值分成√n块,记录每个权值的出现次数以及每块内有多少权值出现过

修改O(1)即可完成 查询时首先扫一遍找到第一个块内有没有覆盖的点的块 然后在块内暴力查找 时间复杂度O(√n)

套个莫队 总时间复杂度O(m√n)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 200200
using namespace std;
struct abcd{
	int l,r,id;
	bool operator < (const abcd &x) const;
}queries[M];
int n,m,b;
int a[M],belong[M],l[M],r[M];
int L=1,R=0,f[M],block_ans[M],ans[M];
bool abcd :: operator < (const abcd &x) const
{
	if(belong[l]!=belong[x.l])
		return l<x.l;
	return r<x.r;
}
void Update(int x)
{
	if(x>n) return ;
	if(!f[x]++)
		block_ans[belong[x]]++;
}
void Downdate(int x)
{
	if(x>n) return ;
	if(!--f[x])
		block_ans[belong[x]]--;
}
int Query()
{
	int i;
	if(!f[0]) return 0;
	for(i=1;l[i];i++)
		if(block_ans[i]!=r[i]-l
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值