比赛 20160415x 评测结果 MMMMMMMMMMMMMMMMMMMM
题目名称 数字查询 最终得分 0
用户昵称 FETS 1/3 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2016-04-15 16:25:42
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=40050;
const int len=3005;
int n,m;
int st[len];
int ed[len];
struct numb
{
	int v;
	int bh;
	int wz;
};
numb a[maxn];
int b[maxn];
int pos[maxn];
int t1[len+5][maxn];
int zs[len][len];
int zss[len];
int css[len];
int c[maxn];
int cs[len][len];
bool mycmp(numb a,numb b)
{
	return a.v<b.v;
}
inline void myswap(int &x,int &y)
{
	int t=y;
	y=x;
	x=t;
	return;
}
int query(int l,int r)
{
	int cx[maxn]={};
	int te[maxn]={};
	int tte=0;
	if(pos[l]+1==pos[r]||pos[l]==pos[r])
	{
		int tzs=0,tcs=0;
		for(int i=l;i<=r;i++)
		{
			cx[b[i]]++;
			if(cx[b[i]]>tcs)
			{
				tcs=cx[b[i]];
				tzs=b[i];
			}
			else if(cx[b[i]]==tcs)
			{
				tzs=min(b[i],tzs);
			}
		}
		printf("%d\n",c[tzs]);
		return c[tzs];
	}
	else 
	{
		int L=(pos[l])*len;
		int R=(pos[r]-1)*len-1;
		for(int i=l;i<=L-1;i++)
		{
			cx[b[i]]++;
			if(cx[b[i]]==1)
				te[++tte]=b[i];
		}
		for(int i=R+1;i<=r;i++)
		{
			cx[b[i]]++;
			if(cx[b[i]]==1)
				te[++tte]=b[i];
		}
		int tcs=cs[L][R];
		int tzs=zs[L][R];
		for(int i=1;i<=tte;i++)
		{
			if(t1[R][te[i]]-t1[L-1][te[i]]+cx[te[i]]>tcs)
			{
				tcs=t1[R][te[i]]-t1[L-1][te[i]]+cx[te[i]];
				tzs=te[i];
			}
		}
		printf("%d\n",c[tzs]);
		return c[tzs];
	}
}
bool mycmp2(numb aa,numb bb)
{
	return aa.wz<bb.wz;
}
int main()
{
	freopen("numquery.in","r",stdin);
	freopen("numquery.in","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i].v);
		a[i].bh=i;
	}
	sort(a+1,a+n+1,mycmp);
	for(int i=1;i<=n;i++)
	{
		if(a[i].v!=a[i-1].v)
		{
			b[a[i].bh]=b[a[i-1].bh]+1;
			c[b[a[i-1].bh]+1]=a[i].v;
		}
		else
		{
			b[a[i].bh]=b[a[i-1].bh];
			c[b[a[i-1].bh]]=a[i].v;
		}
	}
	int t=1;//[0,len-1][len,(2*len-1)]
	for(int i=1;i<=n;i++)
	{
		if(i/len==(i-1)/len)
		{
			pos[i]=t;
		}
		else 
			pos[i]=++t;
	}
	for(int i=1;i<=len;i++)
	{	
		int hh[maxn]={};
		for(int j=i;j<=len;j++)
		{
			for(int k=st[j];k<=ed[j];k++)
			{
				hh[b[k]]++;
				if(cs[i][j]<hh[b[k]])
				{
					zs[i][j]=b[k];
					cs[i][j]=hh[b[k]];
				}
				else if(cs[i][j]==hh[b[k]])
				{
					zs[i][j]=min(b[k],zs[i][j]);
				}
			}
		}
	}
	int de=0;
	for(int i=1;i<=m;i++)
	{
		int L,R;
		scanf("%d %d",&L,&R);
		L=(L+de-1)%n+1;
		R=(R+de-1)%n+1;
		if(L>R)
			myswap(L,R);
		de=query(L,R);
	}
	//搞了两个小时分块啊!!!!!代码炸掉没保存一个关键函数,瞬间20分!!GTMD
}