萌新莫队+值域分块 63pts TLE 求助
查看原帖
萌新莫队+值域分块 63pts TLE 求助
91956
Dreamweaver楼主2021/9/13 20:12

RT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define mod 998244353
#define inf 0x3f3f3f3f
#define re register
#define maxn 200010
#define int long long
#define Orz cout<<"stO %王队% Orz"<<'\n';
int n,m,mx;
int a[maxn],ans[maxn];
struct node
{
	int l,r,k,be;
}q[maxn];
int cnt[maxn];
int tot,sum[maxn],L[maxn],R[maxn],be[maxn];
void init()
{
	int b=sqrt(mx)+1;
	tot=mx/b;
	if(mx%b)	tot++;
	for(re int i=1;i<=tot;++i)
		L[i]=(i-1)*b;
	for(re int i=1;i<=tot;++i)
		R[i]=i*b-1;
	for(re int i=0;i<=n;++i)	
		be[i]=i/b+1;
}
int query()
{
	for(re int i=1;i<=tot;++i)
		if(sum[i]!=(R[i]-L[i]+1))
			for(re int j=L[i];j<=R[i];++j)
				if(!cnt[j])	return j;
}
void add(int x)
{
	cnt[a[x]]++;
	if(cnt[a[x]]==1) sum[a[x]]++;
}
void sub(int x)
{
	cnt[a[x]]--;
	if(!cnt[a[x]])	sum[a[x]]--;
}
bool cmp(node x,node y)
{
	return (x.be^y.be)?x.be<y.be:(x.be&1)?x.r<y.r:x.r>y.r;
}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
inline void wn(int x){if (x<0) {putchar('-');wn(-x);return;}if(x>=10)wn(x/10);putchar(x%10+'0');}
inline void wr(int x){wn(x);putchar('\n');}
inline void wi(int x){wn(x);putchar(' ');}
signed main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
//	printf("%dM\n",(sizeof(dp) >> 20));
	cin>>n>>m;
	int block=n/(sqrt(m*2/3)+1);
	for(re int i=1;i<=n;++i)	a[i]=read(),mx=max(mx,a[i]);
	for(re int i=1;i<=m;++i)	q[i].l=read(),q[i].r=read(),q[i].k=i,q[i].be=q[i].l/block;
	mx+=2;
	init();
	sort(q+1,q+m+1,cmp);
	re int l=1,r=0; 
	for(re int i=1;i<=m;++i)
	{
		while(q[i].l<l)	add(--l);
		while(q[i].l>l)	sub(l++);
		while(q[i].r<r)	sub(r--);
		while(q[i].r>r)	add(++r);
		ans[q[i].k]=query();
	}
	for(re int i=1;i<=m;++i)	wr(ans[i]);
	return 0;
}
2021/9/13 20:12
加载中...