萌新求助
  • 板块学术版
  • 楼主fighterkong
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/12 21:19
  • 上次更新2023/11/4 00:46:29
查看原帖
萌新求助
547618
fighterkong楼主2021/11/12 21:19

WA爆了,P4168求区间众数,实在调不出来了

#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0;
	char ch=getchar();
	while (ch>'9'||ch<'0')ch=getchar();
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x;
}
void write(int x)
{
	if(x>9) write(x/10);
	putchar('0'+x%10);
}
int a[40005],R[205],L[205],buck[40005],disperse[40005],block[205][40005],mode[205];
int main()
{
	int n=read(),m=read();
	for (int i=1;i<=n;++i) {a[i]=read();disperse[i]=a[i];}
	sort(disperse+1,disperse+1+n);
	int tt=unique(disperse+1,disperse+n+1)-disperse-1;
	for (int i=1;i<=n;++i) a[i]=lower_bound(disperse+1,disperse+tt+1,a[i])-disperse;
	int t=sqrt(n);
	int num=(n-1)/t+1;
	for (int i=1;i<=num;++i)
	{
		L[i]=(i-1)*t+1;R[i]=i*t;
		int tmxn=-999;
		if(i==num) R[i]=n;
		for (int j=L[i];j<=R[i];++j)
		{
			if(++block[i][a[j]]>tmxn)
			{
				tmxn=block[i][a[j]];
				mode[i]=a[j];
			}
		}
	}
	int x=0;
	while (m--)
	{
		int l=(read()+x-1)%n+1,r=(read()+x-1)%n+1;
		if(l>r) swap(l,r);
		int p1=(l-1)/t+1,p2=(r-1)/t+1,tmxn=0;
		memset(buck,0,sizeof(buck));
		if(p1==p2)
		{
			for (int i=l;i<=r;++i)
			{
				if(++buck[a[i]]>buck[tmxn]||(buck[a[i]]==buck[tmxn]&&a[i]<tmxn))
				{
					tmxn=a[i];
					x=disperse[a[i]];
				}
			}
			printf("%d\n",x);
			continue;
		}
		for (int i=l;i<=R[p1];++i)
		{
			for (int j=p1+1;j<p2;++j)
			buck[a[i]]+=block[j][a[i]];
			if(++buck[a[i]]>buck[tmxn]||(buck[a[i]]==buck[tmxn]&&a[i]<tmxn))
			{
				tmxn=a[i];
				x=disperse[a[i]];
			}
		}
		for (int i=p1+1;i<p2;++i)
		{
			if(block[i][mode[i]]>buck[tmxn]||(buck[mode[i]]==buck[tmxn]&&a[i]<tmxn))
			{
				tmxn=mode[i];
				x=disperse[mode[i]];
			}
		}
		for (int i=L[p2];i<=r;++i)
		{
			++buck[a[i]];
			if(buck[a[i]]>buck[tmxn]||(buck[a[i]]==buck[tmxn]&&a[i]<tmxn))
			{
				tmxn=a[i];
				x=disperse[a[i]];
			}
		}
		printf("%d\n",x);
	}
	return 0;
}
2021/11/12 21:19
加载中...