题目:
分析:
如果只查询众数的个数,完全可以莫队,加数时容易维护众数的数量,删除数时,众数的数量要么减1,要么不变,只需再开一个标记数组维护众数的数量即可
根据陈立杰---《区间众数解题报告》实现了下面两种解法
解法一:
块数分成sqrt(n)超时了,150可以过(分块真毒瘤)
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 15;
int a[MAXN], b[MAXN], c[MAXN], vis[MAXN], belong[MAXN], dp[1000][1000], block, n, m, L, R;
void cal(int x) {
int res = 0, cnt = 0;
memset(vis, 0, sizeof(vis));
for (int i = (x - 1) * block + 1; i <= n; ++i) {
vis[c[i]]++;
if (vis[c[i]] > cnt) res = c[i], cnt = vis[c[i]];
else if (vis[c[i]] == cnt && c[i] < res) res = c[i];
dp[x][belong[i]] = res;
}
}
std::vector<int> pos[MAXN];
int Find(int x, int l, int r) {
return upper_bound(pos[x].begin(), pos[x].end(), r) - lower_bound(pos[x].begin(), pos[x].end(), l);
}
int query(int l, int r) {
int res = 0, cnt = 0;
if (belong[l] == belong[r]) {
for (int i = l; i <= r; ++