求助,分块0分
查看原帖
求助,分块0分
521276
张凯_巨大楼主2022/1/11 10:31

rt.wa成0分。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int vl[50010],v2[50010];
int v3[50010];
int ds;
int n,m,bl;
int ord[50010];
int vs[210][50010],mx[210],mv[210];
bool cmp(int x,int y)
{
	return  vl[x]<vl[y];
}
int q[40010],t[40010];
int getmx(int il,int ir,int qs)
{
	int ret=0,r2;
	for(int i=il;i<=ir;i++)
	{
		if(q[v2[i]]!=qs)
		{
			q[v2[i]]=qs;
			t[v2[i]]=0;
		}
		t[v2[i]]++;
		if(t[v2[i]]>ret||t[v2[i]]==ret&&v2[i]<r2)
		{
			ret=t[v2[i]];
			r2=v2[i];
		}
	}
	return r2;
}
int getsm(int il,int ir,int iv)
{
	int ret=vs[ir/bl-1][iv]-vs[il/bl][iv];
	for(int i=il;i<il/bl*bl+bl;i++)
	{
		if(v2[i]==iv)
		{
			ret++;
		}
	}
	for(int i=ir/bl*bl;i<=ir;i++)
	{
		if(v2[i]==iv)
		{
			ret++;
		}
	}
	return ret;
}
int main()
{
	cin>>n>>m;
	bl=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin>>vl[i];
		ord[i]=i;
	}
	sort(ord+1,ord+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(vl[ord[i]]!=vl[ord[i-1]])
		{
			ds++;
			v3[ds]=vl[ord[i]];
		}
		v2[ord[i]]=ds;
	}
	for(int i=1;i<n/bl;i++)
	{
		for(int j=1;j<=ds;j++)
		{
			vs[i][j]+=vs[i-1][j];
		}
		for(int j=i*bl;j<i*bl+bl;j++)
		{
			vs[i][v2[j]]++;
			if(mx[i]<vs[i][v2[j]]-vs[i-1][v2[j]]||mx[i]==vs[i][v2[j]]-vs[i-1][v2[j]]&&mv[i]>v2[j])
			{
				mv[i]=v2[j];
				mx[i]=vs[i][v2[j]]-vs[i-1][v2[j]];
			}
		}
	}
	int x=0,k;
	while(m--)
	{
		int il,ir;
		cin>>il>>ir;
		il=(il+x-1)%n+1;
		ir=(ir+x-1)%n+1;
		if(il>ir)
		{
			swap(il,ir);
		}
		k=0;
		if(il/bl==ir/bl)
		{
			x=getmx(il,ir,m);
		}
		else
		{
			x=getmx(il,il/bl*bl+bl-1,m);
			k=getsm(il,ir,x);
			int xr=getmx(ir/bl*bl,ir,m),y=getsm(il,ir,xr);
			if(k<y||y==k&&xr<x)
			{
				x=xr;
				k=y;
			}
			for(int i=il/bl+1;i<ir/bl;i++)
			{
				xr=mv[i];
				y=vs[ir/bl-1][xr]-vs[il/bl][xr]+t[xr];
				if(k<y||y==k&&xr<x)
				{
					x=xr;
					k=y;
				}
			}
		}
		x=v3[x];
		cout<<x<<endl;
	}
	return 0;
}
2022/1/11 10:31
加载中...