分块0pts求助,样例过了
查看原帖
分块0pts求助,样例过了
1098908
dread_breaker楼主2025/1/26 09:49
#include<bits/stdc++.h>
using namespace std;

const int M = 4e4 + 5, N = sqrt(4e4 + 5);
int n, m, B, tot, cnt, a[M], b[M], f[N][N], f_k[N][N], t[N];	
vector <int> G[M];
struct bucket{
	int mx, mxid, t[M];
	void insert(int x) {
		++t[x];
		if(t[x] > mx) mx = t[x], mxid = x;
		else if(t[x] == mx) mxid = min(mxid, x);
	}
}buc;

int get_block(int x) { return (x + B - 1) / B; }
int sub1(int x) { return B * (x - 1) + 1; }
int sub2(int x) { return min(B * x, n); }

inline void pre_G() {
	sort(b + 1, b + n + 1);
	int sum = unique(b + 1, b + n + 1) - b - 1;
	for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + sum + 1, a[i]) - b;
	for(int i = 1; i <= n; i++) G[i].push_back(0);
	for(int i = 1; i <= n; i++) G[a[i]].push_back(i);
	return;
}

int count(int x, int l, int r) {
	return upper_bound(G[x].begin(), G[x].end(), r) - upper_bound(G[x].begin(), G[x].end(), l - 1);
}

inline void pre_mode() {
	cnt = get_block(n);
	for(int i = 1; i <= cnt; i++) {
		int p = sub1(i) - 1;
		for(int j = i; j <= cnt; j++) {
			while(p < sub2(j)) buc.insert(a[++p]);
			f[i][j] = buc.mxid, f_k[i][j] = buc.mx;
		}
		memset(buc.t, 0, sizeof(buc.t));
		buc.mx = buc.mxid = 0;
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	B = sqrt(n);
	for(int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
	pre_G(), pre_mode();
	int l, r;
	while(m--) {
		cin >> l >> r;
		int lb = get_block(l), rb = get_block(r);
		if((l - 1) % B) lb++;
		if(r % B) rb--;
		int ans_v = f[lb][rb], ans_k = f_k[lb][rb];
		for(int i = l, e = sub1(lb); i < e; i++) {
			int tmp = count(a[i], l, r);
			if(tmp >= ans_k) ans_k = tmp, ans_v = min(ans_v, a[i]);
		}
		for(int i = sub2(rb) + 1; i <= r; i++) {
			int tmp = count(a[i], l, r);
			if(tmp >= ans_k)  ans_k = tmp, ans_v = min(ans_v, a[i]);
		}
		cout << b[ans_v] << "\n";
	}
	return 0;
}
2025/1/26 09:49
加载中...