站外题求助(分块)
  • 板块学术版
  • 楼主Mr_Biantainne
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/7/2 19:12
  • 上次更新2023/11/3 11:51:54
查看原帖
站外题求助(分块)
545601
Mr_Biantainne楼主2023/7/2 19:12

调了一天了,总是超时,题面。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#define ll long long 
using namespace std;
ll n, m, k, a[40005], b[40005], d[40005], qp[40005], sum[35][40005], lst, x, y, tk;
ll ask(ll l, ll r)
{
	memset(b, 0, sizeof(b));
	ll p = qp[l], q = qp[r] - 1, ans = 0, idex = 0;
	for (ll i = l; i <= min(k * p, r); i++) b[a[i]]++;
	if (p != q + 1)
	{
		for (ll i = q * k + 1; i <= r; i++) b[a[i]]++;
	}
	for (ll i = p + 1; i <= q; i++) for (ll j = 1; j <= tk; j++) b[j] += sum[i][j];
	for (ll i = 1; i <= tk; i++)
	{
		//cout << b[i] << " ";
		if (b[i] > ans)
		{
			ans = b[i];
			idex = i;
		}
	}
	//cout << endl;
	return idex;
}
int main()
{
	cin >> n >> m;
	k = n / cbrt(n);
	for (ll i = 1; i <= n; i++)
	{
		qp[i] = (i + k - 1) / k;
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b + 1, b + n + 1);
	tk = unique(b + 1, b + n + 1) - b - 1;
	for (ll i = 1; i <= n; i++)
	{
		ll p = lower_bound(b + 1, b + tk + 1, a[i]) - b;
		d[p] = a[i];
		a[i] = p;
		//cout << a[i] << " ";
		sum[qp[i]][a[i]]++;
	}
	//cout << endl;
	while (m--)
	{
		cin >> x >> y;
		x = (lst + x - 1) % n + 1, y = (lst + y - 1) % n + 1;
		if (x > y) swap(x, y);
		//cout << "_________________________________________________\n";
		//cout << x << " " << y << endl;
		lst = d[ask(x, y)];
		cout << lst << endl;
	}
}
2023/7/2 19:12
加载中...