求助,为什么RE了
查看原帖
求助,为什么RE了
249422
TinyMirror1楼主2021/4/16 13:43

spoj的一样的题过了,但是uva的RE了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 1e5 + 5;
int n, m, B;
struct question {
	int l, r, id;
	bool operator < (question x) const {
		if (l / B != x.l / B) return l < x.l;
		return (l / B) & 1? r < x.r : r > x.r;
	}
} q[maxn];
int a[maxn], ans[maxn], tans;
int cnt[maxn], tem[maxn];
void add(int x) {
	cnt[x]++;
	tem[cnt[x]]++;
	tem[cnt[x] - 1]--;
	tans = max(tans, cnt[x]);
}
void del(int x) {
	cnt[x]--;
	tem[cnt[x]]++;
	tem[cnt[x] + 1]--;
	if (tem[tans] == 0) tans--;
}
void init() {
	B = 1.0 * n / sqrt(m);
	tans = 0;
	memset(cnt, 0, sizeof(cnt));
	memset(tem, 0, sizeof(tem));
}
int main() {
	while (true) {
		scanf("%d", &n);
		if (n == 0) return 0;
		scanf("%d", &m);
		init();
		int k = 99999999, tot = 0;
		for (int i = 1; i <= n; i++) {
			int s; scanf("%d", &s);
			if (s == k) a[i] = tot;
			else a[i] = ++tot;
			k = s;
		}
		for (int i = 1; i <= m; i++) {
			scanf("%d %d", &q[i].l, &q[i].r);
			q[i].id = i;
		}
		sort(q + 1, q + 1 + m);
		int l = 1, r = 0;
		for (int i = 1; i <= m; i++) {
			while (r < q[i].r) add(a[++r]);
			while (r > q[i].r) del(a[r--]);
			while (l < q[i].l) del(a[l++]);
			while (l > q[i].l) add(a[--l]);
			ans[q[i].id] = tans;
		}
		for (int i = 1; i <= m; i++) {
			printf("%d\n", ans[i]);
		}
	}	
	return 0;
}
2021/4/16 13:43
加载中...