分块,0pts,求调QAQ
查看原帖
分块,0pts,求调QAQ
636936
tyccyt楼主2024/7/28 22:38

调了一天了—— 唉—— 可以帮忙看看吗?

#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5,B=205;
int n,m,cnt=0,f[B][B],p[B][N];
int bl,tot,L[B],R[B],id[N],t[N];
struct node
{
	int x,y,d;
}a[N];
bool cmp2(node a,node b)
{
	return a.d<b.d;
}
bool cmp1(node a,node b)
{
	return a.x<b.x;
}
int ans[N];
int query(int l,int r)
{
	int ql=id[l],qr=id[r];
	if(qr-ql<=2)
	{
		for(int i=l;i<=r;i++)
		{
			t[a[i].y]=0;
		}
		int sum=0,ad;
		for(int i=l;i<=r;i++)
		{
			t[a[i].y]++;
			if(t[a[i].y]>sum)
			{
				sum=t[a[i].y];
				ad=a[i].y;
			}
			else if(t[a[i].y]==sum)
			{
				sum=t[a[i].y];
				ad=min(ad,a[i].y);
			}
		}
		return ans[ad];
	}
	memset(t,0,sizeof t);
	int ad;
	int mx=0;
	for(int i=l;i<=R[ql];i++)
	{
		t[a[i].y]++;
		int sum=p[qr-1][a[i].y]-p[ql][a[i].y];
		if(t[a[i].y]+sum>mx)
		{
			mx=t[a[i].y]+sum;
			ad=a[i].y;
		}
		else if(t[a[i].y]+sum==mx)
		{
			mx=t[a[i].y]+sum;
			ad=min(ad,a[i].y);
		}
	}
	for(int i=L[qr];i<=r;i++)
	{
		t[a[i].y]++;
		int sum=p[qr-1][a[i].y]-p[ql][a[i].y];
		if(t[a[i].y]+sum>mx)
		{
			mx=t[a[i].y]+sum;
			ad=a[i].y;
		}
		else if(t[a[i].y]+sum==mx)
		{
			mx=t[a[i].y]+sum;
			ad=min(ad,a[i].y);
		}
	}
	memset(t,0,sizeof t);
	int add=f[ql+1][qr-1];
	if(mx<p[qr-1][add]-p[ql][add])ad=add;
	return ans[ad];
}
int main()
{
	scanf("%d%d",&n,&m);
	bl=sqrt(n);
	tot=(n-1)/bl+1;
	for(int i=1;i<=n;i++)
	{
		id[i]=(i-1)/bl+1;
		scanf("%d",&a[i].x);
		a[i].d=i;
	}
	sort(a+1,a+n+1,cmp1);
	int cnt=0;
	a[0].x=n+1;
	for(int i=1;i<=n;i++)
	{
		if(a[i].x!=a[i-1].x)
		{
			cnt++;
		}
		a[i].y=cnt;
		ans[cnt]=a[i].x;
	}
	sort(a+1,a+n+1,cmp2);
	for(int i=1;i<=tot;i++)
	{
		L[i]=R[i-1]+1;
		R[i]=(i==tot?n:i*bl);
	}
	for(int i=1;i<=tot;i++)
	{
		memset(t,0,sizeof t);
		int mx=0,ad;
		for(int j=i;j<=tot;j++)
		{
			for(int k=L[j];k<=R[j];k++)
			{
				t[a[k].y]++;
				if(t[a[k].y]>mx)
				{
					mx=t[a[k].y];
					ad=a[i].y;
				}
				else if(t[a[k].y]==mx)
				{
					mx=t[a[k].y];
					ad=min(ad,a[i].y);
				}
			}
			f[i][j]=ad;
		}
		memset(t,0,sizeof t);
	}
	for(int i=1;i<=tot;i++)
	{
		for(int j=1;j<=n;j++)p[i][j]=p[i-1][j];
		for(int j=L[i];j<=R[i];j++)
		{
			p[i][a[j].y]++;
		}
	}
	int lst=0;
	while(m--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		l=((l+lst-1)%n)+1;
		r=((r+lst-1)%n)+1;
		if(l>r)swap(l,r);
		lst=query(l,r);
		cout<<lst<<'\n';
	}
	return 0;
}
2024/7/28 22:38
加载中...