求卡常
查看原帖
求卡常
723198
AAA404楼主2023/8/31 17:21

萌新写Ynoi被虐哭了呜呜呜

超时是在询问,怎么卡都稳定超时

#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
const int N=5e5+5,ghN=3100;
int n,m,a[N],l[N],L[ghN],R[ghN],f[ghN][ghN],block,tot,belong[N],cnt[N],lastans;
vector<int>v[N];
inline void lsh()
{
	sort(l+1,l+1+n);
	int cnt=unique(l+1,l+n+1)-l-1;
	for(register int i=1;i<=n;i++)
		a[i]=lower_bound(l+1,l+cnt+1,a[i])-l;
	return;
}
inline void init()
{
	block=sqrt(n*log2(n));
	tot=(n-1)/block+1;
	for(register int i=1;i<=tot;i++)	
		L[i]=R[i-1]+1,R[i]=i*block;
	R[tot]=n;
	for(register int i=1;i<=tot;i++)
		for(register int j=L[i];j<=R[i];j++)
			belong[j]=i;
	return;
}
inline void pre(int x)
{
	memset(cnt,0,sizeof cnt);
	int mode=0,maxx=0;
	for(register int i=L[x];i<=n;i++)
	{
		int t=belong[i];
		cnt[a[i]]++;
		if(cnt[a[i]]>maxx||(cnt[a[i]]==maxx&&a[i]<mode))
		{
			mode=a[i];
			maxx=cnt[a[i]];
		}
		f[x][t]=mode;
	}
	return;
}
inline int solve(int l,int r,int a)
{
	int x=upper_bound(v[a].begin(),v[a].end(),r)-v[a].begin();
	int y=lower_bound(v[a].begin(),v[a].end(),l)-v[a].begin();
	return x-y;
}
inline int query(int l,int r)
{
	if(belong[l]==belong[r])
	{
		int maxx=0,mode=0;
		for(register int i=l;i<=r;i++)
		{
			int tmp=solve(l,r,a[i]);
			if(tmp>maxx||(tmp==maxx&&a[i]<mode))
			{
				maxx=tmp;
				mode=a[i];
			}
		}
		return maxx;
	}
	int p=belong[l],q=belong[r];
	int mode=f[p+1][q-1];
	int maxx=solve(l,r,mode);
	for(register int i=l;i<=R[p];i++)
	{
		int tmp=solve(l,r,a[i]);
		maxx=max(tmp,maxx);
	}
	for(register int i=r;i>=L[q];i--)
	{
		int tmp=solve(l,r,a[i]);
		maxx=max(maxx,tmp);
	}
	return maxx;
}
inline int read()
{
	char ch=getchar();int s=0,w=1;
	while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){s=s*10+ch-48;ch=getchar();}
	return s*w;
}
int main()
{
	clock_t c1=clock();
#ifdef LOCAL
 	freopen("1.in","r",stdin);
 	freopen("1.out","w",stdout);
#endif
    n=read(),m=read();
	for(register int i=1;i<=n;i++)l[i]=a[i]=read();
	lsh();
	init();
	for(register int i=1;i<=tot;i++)
		pre(i);
// 	return 0;
	for(register int i=1;i<=n;i++)
		v[a[i]].push_back(i);
// 	return 0;
	while(m--)
	{
		int l=read(),r=read();
		l^=lastans,r^=lastans;
		printf("%d\n",(lastans=query(l,r)));
	}
#ifdef LOCAL
	cerr<<"Time used:"<<clock()-c1<<"ms";
#endif
 	return 0;
}
2023/8/31 17:21
加载中...