最最最简单的莫队WA求调T^T
  • 板块学术版
  • 楼主zhanglh
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/7/24 14:36
  • 上次更新2024/7/24 15:28:35
查看原帖
最最最简单的莫队WA求调T^T
726862
zhanglh楼主2024/7/24 14:36

简化题意

给定长度为 nn 的非降序列,qq 次询问给定 l,rl, r,求区间 [l,r][l, r] 内出现次数最多的数的出现次数。

1≤n,q≤1051≤n, q≤10^5

−105≤ai≤105-10^5≤a_i≤10^5

WA,莫队。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n, q, T, a[100010], c[100010], ans[100010], cnt, maxc[100010];
struct Range {
	int l, r, id;
	bool operator <(const Range &W)const {
		if (l / T != W.l / T) return l < W.l;
		return r < W.r;
	}
}b[100010];
void add(int x) {
   maxc[c[x]] -- ;
	c[x] ++ ;
	maxc[c[x]] ++ ;
	cnt = max(cnt, c[x]);
}
void del(int x) {
	if (cnt == c[x] && maxc[c[x]] == 1) cnt -- ;
	maxc[c[x]] -- ;
	c[x] -- ;
	maxc[c[x]] ++ ;
}
int main() {
	scanf("%d%d", &n, &q);
	T = sqrt(n);
	for (int i = 1; i <= n; i ++ ) {
	    scanf("%d", &a[i]);
	    a[i] += 100010;
	}
	for (int i = 1; i <= q; i ++ ) {
		scanf("%d%d", &b[i].l, &b[i].r);
		b[i].id = i;
	}
	sort(b + 1, b + q + 1);
	int L = 1, R = 0;
	for (int i = 1; i <= q; i ++ ) {
		while (L > b[i].l) add(a[ -- L]);
		while (R < b[i].r) add(a[ ++ R]);
		while (L < b[i].l) del(a[L ++ ]);
		while (R > b[i].r) del(a[R -- ]);
		ans[b[i].id] = cnt;
	}
	for (int i = 1; i <= q; i ++ ) printf("%d\n", ans[i]);
	return 0;
}
2024/7/24 14:36
加载中...