分块 95pts 求条
查看原帖
分块 95pts 求条
814145
XXh0919楼主2025/1/16 17:28

WA on #8,实在调不出来了。。。

#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define per(i,a,b) for(register int i=(a);i>=(b);--i)
#define pi pair<int,int>
#define mkp(a,b) make_pair((a),(b)) 
#define IOS cin.tie(0)->sync_with_stdio(0);
using namespace std;
const int N = 1e6 + 15, M = 1e3 + 15;

const int I_LOVE_CCF = 1;

int n, t, len, m2;
int a[N], b[N], id[N];
int l[N], r[N], pos[N];
int cnt[N], m[M][M];
int sum[M][M * 10];

inline int read () {
	int x = 0, f = 1;
	char ch = getchar ();
	while (!isdigit (ch)) {
		if (ch == '-') f = -1;
		ch = getchar ();
	}
	while (isdigit (ch)) {
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar ();
	}
	return x * f;
}

void init () {
	rep (i, 1, t) {
		l[i] = r[i - 1] + 1;
		r[i] = i * t;
	}
	if (r[t] < n) {
		r[t] = n;
		l[t] = r[t - 1] + 1;
	}
	rep (i, 1, t) {
		rep (j, l[i], r[i]) {
			pos[j] = i;
			sum[i][a[j]] ++;
		}
		rep (j, 1, len) {
			sum[i][j] += sum[i - 1][j];
		}
	}
	rep (i, 1, t) {
		rep (j, i, t) {
			m[i][j] = m[i][j - 1];
			rep (k, l[j], r[j]) {
				if ((sum[j][a[k]] - sum[i - 1][a[k]] > sum[j][m[i][j]] - sum[i - 1][m[i][j]]) || (sum[j][a[k]] - sum[i - 1][a[k]] == sum[j][m[i][j]] - sum[i - 1][m[i][j]] && a[k] < m[i][j])) {
					m[i][j] = a[k];
				}
			}
		}
	}
}

int query (int ll, int rr) {
	int p = pos[ll], q = pos[rr];
	int ans = 0;
	if (q - p <= 1) {
		rep (i, ll, rr) {
			cnt[a[i]] ++;
		}
		rep (i, ll, rr) {
			if ((cnt[a[i]] > cnt[ans]) || (cnt[a[i]] == cnt[ans] && a[i] < ans)) {
				ans = a[i];
			}
		}
		rep (i, ll, rr) {
			cnt[a[i]] = 0;
		}
		return b[ans];
	}
	rep (i, ll, r[p]) {
		cnt[a[i]] ++;
	}
	rep (i, l[q], rr) {
		cnt[a[i]] ++;
	}
	ans = m[p + 1][q - 1];
	rep (i, ll, r[p]) {
		int now = cnt[a[i]] + sum[q - 1][a[i]] - sum[p][a[i]];
		int pre = cnt[ans] + sum[q - 1][ans] - sum[p][ans];
		if ((now > pre) || (now == pre && ans > a[i])) {
			ans = a[i];
		}
	}
	rep (i, l[q], rr) {
		int now = cnt[a[i]] + sum[q - 1][a[i]] - sum[p][a[i]];
		int pre = cnt[ans] + sum[q - 1][ans] - sum[p][ans];
		if ((now > pre) || (now == pre && ans > a[i])) {
			ans = a[i];
		}
	}
	rep (i, ll, r[p]) {
		cnt[a[i]] = 0;
	}
	rep (i, l[q], rr) {
		cnt[a[i]]  = 0;
	}
	return b[ans];
}

signed main () {
//	freopen ("P4168_8.in", "r", stdin);
//	freopen ("P4168....8.out", "w", stdout);
	n = read ();
	m2 = read ();
	t = 2 * sqrt (n); 
	rep (i, 1, n) b[i] = a[i] = read ();
	sort (b + 1, b + n + 1);
	len = unique (b + 1, b + n + 1) - b - 1;
	rep (i, 1, n) {
		id[i] = lower_bound (b + 1, b + len + 1, a[i]) - b;
		a[i] = id[i];
	}
	init ();
	int x = 0;
	while (m2 --) {
		int l = read (), r = read ();
		l = (l + x - 1) % n + 1, r = (r + x - 1) % n + 1;
		if (l > r) swap (l, r);
		x = query (l, r);
		cout << x << endl;
	}
	return 0;
}

可能码风有点奇怪,不过还请帮忙改改吧。

2025/1/16 17:28
加载中...