比赛 20160415x 评测结果 EEEEWAATWWWTATWWTATT
题目名称 数字查询 最终得分 20
用户昵称 WAHT 运行时间 24.711 s
代码语言 C++ 内存使用 50.87 MiB
提交时间 2016-04-15 16:15:40
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=40010;
const ll maxx=2323237;
int x[maxx],y[maxx],num,ans=0;
void hash(int a,int v)
{
	ll temp=a;
	while(y[temp]!=0&&y[temp]!=a)	temp=(temp*1519+7)%maxx;
	y[temp]=a,x[temp]+=v;
	if(x[temp]>num||(num==x[temp]&&ans>a))	num=x[temp],ans=a;
}
int n,m;
int a[maxn];
void work1()
{
	int l,r;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		int L=(l+ans-1)%n+1,R=(r+ans-1)%n+1;
		if(L>R)	swap(L,R);
		for(int i=L;i<=R;i++)
			hash(a[i],1);
		printf("%d\n",ans);
		for(int i=L;i<=R;i++)
			hash(a[i],-1);
		num=0;
	}
}
struct my
{
	int v,x;
}b[maxn];
bool cm(my a,my b){	return a.v<b.v;}
bool cm2(my a,my b){return a.x<b.x;}
int c[210][maxn],d[maxn],h[210][210],shu[210];
void work2()
{
	int unit=(int)sqrt(n*1.0);
	for(int i=1;i<=n;i++)	b[i].v=a[i],b[i].x=i;
	sort(a+1,a+1+n);
	sort(b+1,b+1+n,cm);
	for(int i=1;i<=n;i++)
	{
		if(a[i]!=a[i-1])	{	num++;	d[num]=a[i];}
		b[i].v=num;
	}
	sort(b+1,b+1+n,cm2);
	int k=1;
	while(k*unit<n)
	{
		for(int i=(k-1)*unit+1;i<=k*unit;i++)
		{	
			if(c[k][b[i].v]==0)	shu[k]++,h[k][shu[k]]=b[i].v;
			c[k][b[i].v]++;
		}
		k++;
	}
	for(int i=(k-1)*unit+1;i<=n;i++)
	{	
		if(c[k][b[i].v]==0)	shu[k]++,h[k][shu[k]]=b[i].v;
		c[k][b[i].v]++;
	}

	int l,r;
	for(int z=1;z<=m;z++)
	{
		scanf("%d%d",&l,&r);
		int L=(l+d[ans]-1)%n+1,R=(r+d[ans]-1)%n+1;
		if(L>R)	swap(L,R);
		int s[maxn]={},A=0,i=1;
		while(i*unit<L)	i++;
		for(int j=L;j<=min(i*unit,R);j++)
		{	
			s[b[j].v]++;
			if(s[b[j].v]>A||(s[b[j].v]==A&&b[j].v<ans))	
				A=s[b[j].v],ans=b[j].v;
		}
		i++;
		while(i*unit<=R)
		{
			for(int j=1;j<=shu[i];j++)
				{	
					s[h[i][j]]+=c[i][h[i][j]];
					if(s[h[i][j]]>A||(s[h[i][j]]==A&&h[i][j]<ans))	
						A=s[h[i][j]],ans=h[i][j];
				}
			i++;
		}
		if(i*unit-unit>L)
		for(int j=i*unit-unit+1;j<=R;j++)
		{	
			s[b[j].v]++;
			if(s[b[j].v]>A||(s[b[j].v]==A&&b[j].v<ans))
				A=s[b[j].v],ans=b[j].v;
		}
		printf("%d\n",d[ans]);
	}
}
int main()
{
	freopen("numquery.in","r",stdin);
	freopen("numquery.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	
	if(n<=10000)	work1();
	else	
		work2();
	return 0;
}