萌新刚学 OI,求助 TLE 95pts 的蒲公英
查看原帖
萌新刚学 OI,求助 TLE 95pts 的蒲公英
298549
SIXIANG32楼主2022/3/20 21:09
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#define MAXN 110000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n, m, cnt;
int a[MAXN + 10], qaq[MAXN + 10];
int pl[MAXN + 10], pr[MAXN + 10], cl[MAXN + 10], len;
int c[MAXN + 10];
int f[1000 + 10][1000 + 10][2];
vector <int> vec[MAXN + 10];
int big, gib;
int finding(int l, int r, int x) {
	return upper_bound(vec[x].begin(), vec[x].end(), r) - lower_bound(vec[x].begin(), vec[x].end(), l);
}
void Three_Flower() {
	for(int p = 1; p <= n; p++) qaq[p] = a[p];
	sort(qaq + 1, qaq + n + 1);
	cnt = unique(qaq + 1, qaq + n + 1) - qaq - 1;
	for(int p = 1; p <= n; p++)
		a[p] = lower_bound(qaq + 1, qaq + cnt + 1, a[p]) - qaq;
}
void qwq(int l, int r, int num) {
	int cnt = finding(l, r, num);
	if(cnt > big || (cnt == big && num < gib)) {
		big = cnt;
		gib = num;
	}
}
int solve(int l, int r) {
	int L = cl[l], R = cl[r];
	int x = 0, y = 0;
	if(L + 1 <= R - 1) x = L + 1, y = R - 1;
	big = f[x][y][0], gib = f[x][y][1];
	if(L == R)
		for(int p = l; p <= r; p++) qwq(l, r, a[p]);
	else {
		for(int p = l; p <= pr[L]; p++) qwq(l, r, a[p]);
		for(int p = pl[R]; p <= r; p++) qwq(l, r, a[p]);
	}
	return qaq[gib];
}
void block() {
	len = sqrt(log(n) / log(2) * n);
	for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
		pl[p] = (p - 1)* len + 1;
		pr[p] = p * len;
	}
	for(int p = 1; p <= n; p++)
		cl[p] = (p - 1) / len + 1;
	for(int p = 1; p <= ceil(n * 1.0 / len); p++)
		for(int i = p; i <= ceil(n * 1.0 / len); i++) {
			memset(c, 0, sizeof(c));
			for(int j = pl[p]; j <= pr[i]; j++) c[a[j]]++;
			for(int j = 1; j <= cnt; j++)
				if(c[j] > f[p][i][0] || (c[j] == f[p][i][0] && j < f[p][i][1]))
					f[p][i][0] = c[j], f[p][i][1] = j;
		}
}
int main() {
	scanf("%d%d", &n, &m);
	for(int p = 1; p <= n; p++) scanf("%d", &a[p]);
	Three_Flower();
	for(int p = 1; p <= n; p++) vec[a[p]].push_back(p);
	block();
	int last = 0;
	while(m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		x = (x + last - 1) % n + 1, y = (y + last - 1) % n + 1;
		if(x > y) swap(x, y);
		last = solve(x, y);
		printf("%d\n", last);
	}
}

思路是 https://www.luogu.com.cn/blog/user5912/solution-p4168

就是 lyd 巨佬在书上写的第二种方法,然后 T 了一个点 QAQ,求助

2022/3/20 21:09
加载中...