莫队求调 RE一片
查看原帖
莫队求调 RE一片
524994
Ptilopsis_楼主2025/1/19 16:50

rt,写的普通莫队+值域分块,不知为何听取RE一片(

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+2;
int read()
{
	int x=0;char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)){x=x*10+(c^48);c=getchar();}
	return x;
}
int n,m,len,a[N],id[N],cnt[N],cntb[N],ans[N];
struct query
{
	int l,r,qid;
	friend bool operator < (query a,query b)
	{
		return id[a.l]!=id[a.r]?id[a.l]<id[a.r]:((id[a.l]&1)?a.r<b.r:a.r>b.r);
	}
}q[N];
void add(int x)
{
	cnt[a[x]]++,cntb[id[a[x]]]++;
}
void del(int x)
{
	cnt[a[x]]--,cntb[id[a[x]]]--;
}
int query(int x)
{
	for(int i=1;i<=id[n];i++)
	{
		if(cntb[i]*2>x)
		{
			for(int j=(i-1)*len+1;id[j]==i&&j<=n;j++)
				if(cnt[j]*2>x)
					return j;
			return 0;
		}
	}
	return 0;
}
int main()
{
	n=read(),m=read();
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		id[i]=(i-1)/len+1;
	}
	int u,v;
	for(int i=1;i<=m;i++)
	{
		u=read(),v=read();
		q[i]={u,v,i};
	}
	sort(q+1,q+1+m);
	int l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		int L=q[i].l,R=q[i].r;
		while(l>L)
			add(--l);
		while(r<R)
			add(++r);
		while(l<L)
			del(l++);
		while(r>R)
			del(r--);
		ans[q[i].qid]=query(R-L+1);
	}
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
}

2025/1/19 16:50
加载中...