【玄关】大分块WA#8,求助
查看原帖
【玄关】大分块WA#8,求助
1054732
plgo楼主2025/1/23 15:56

Code:Code:

#include <bits/stdc++.h>
using namespace std;
long long n,m,q,tot,a[4000005],b[4000005],c[4000005],d[1005][1005],x[4000005],y[4000005],f1[4000005],f2[1005][10005];
long long fun(long long l,long long r)
{
	long long cnt1 = f1[l],cnt2 = f1[r],ans = 0;
	if(cnt2 - cnt1 <= 1)
	{
		for(long long i = l;i <= r;i++)
		{
			c[a[i]]++;
		}
		for(long long i = l;i <= r;i++)
		{
			if(c[a[i]] > c[ans] || (a[i] < ans && c[a[i]] == c[ans]))
			{
				ans = a[i];
			}
		}
		for(long long i = l;i <= r;i++)
		{
			c[a[i]] = 0;
		}
		return b[ans];
	}
	for(long long i = l;i <= y[cnt1];i++)
	{
		c[a[i]]++;
	}
	for(long long i = x[cnt2];i <= r;i++)
	{
		c[a[i]]++;
	}
	ans = d[cnt1 + 1][cnt2 - 1];
	for(long long i = l;i <= y[cnt1];i++)
	{
		long long u = c[a[i]] + f2[cnt2 - 1][a[i]] - f2[cnt1][a[i]],v = c[ans] + f2[cnt2 - 1][ans] - f2[cnt1][ans];
		if(u > v)
		{
			ans = a[i];
		}
		else if(u == v && ans > a[i])
		{
			ans = a[i];
		}
	}
	for(long long i = x[cnt2];i <= r;i++)
	{
		long long u = c[a[i]] + f2[cnt2 - 1][a[i]] - f2[cnt1][a[i]],v = c[ans] + f2[cnt2 - 1][ans] - f2[cnt1][ans];
		if(u > v)
		{
			ans = a[i];
		}
		else if(u == v && ans > a[i])
		{
			ans = a[i];
		}
	}
	for(long long i = l;i <= y[cnt1];i++)
	{
		c[a[i]] = 0;
	}
	for(long long i = x[cnt2];i <= r;i++)
	{
		c[a[i]] = 0;
	}
	return b[ans];
}
int main()
{
	scanf("%lld%lld",&n,&q);
	tot = 2 * sqrt(n); 
	for(long long i = 1;i <= n;i++)
	{
		scanf("%lld",&a[i]);
		b[i] = a[i];
	}
	sort(b + 1,b + n + 1);
	m = unique(b + 1,b + n + 1) - b - 1;//去重
	for(long long i = 1;i <= n;i++)
	{
		a[i] = lower_bound(b + 1,b + m + 1,a[i]) - b;//找第一个
	}
	for(long long i = 1;i <= tot;i++)
	{
		x[i] = y[i - 1] + 1;
		y[i] = i * tot;
	}
	if(y[tot] < n)
	{
		y[tot] = n;
		x[tot] = y[tot - 1] + 1;
	}
	for(long long i = 1;i <= tot;i++)//预处理
	{
		for(long long j = x[i];j <= y[i];j++)
		{
			f1[j] = i;
			f2[i][a[j]]++;
		}
		for(long long j = 1;j <= m;j++)
		{
			f2[i][j] += f2[i - 1][j];
		}
	}
	for(long long i = 1;i <= tot;i++)
	{
		for(long long j = 1;j <= tot;j++)
		{
			d[i][j] = d[i][j - 1];
			for(long long k = x[j];k <= y[j];k++)
			{
				if(f2[j][a[k]] - f2[i - 1][a[k]] > f2[j][d[i][j]] - f2[i - 1][d[i][j]] || (a[k] < d[i][j] && f2[j][a[k]] - f2[i - 1][a[k]] == f2[j][d[i][j]] - f2[i - 1][d[i][j]]))
				{
					d[i][j] = a[k];
				}
			}
		}
	}
	long long t = 0;
	while(q--)
	{
		long long l0,r0;
		scanf("%lld%lld",&l0,&r0);
		long long l = (l0 + t - 1) % n + 1,r = (r0 + t - 1) % n + 1;
		if(l > r)
		{
			swap(l,r);
		}
		t = fun(l,r);//!
		printf("%lld\n",t);
	}
	return 0;
}

!急!

调不出来了,求助一下,AC给 22 关注

\bx\bx\bx

2025/1/23 15:56
加载中...