P7252 题解
namelessgugugu · · 题解
首先这题显然可以有一万种做法做到
考虑到如果区间有绝对众数,那么如果你随机挑选一个区间中的数,取到答案的概率超过
最后一个问题就是怎么算一个值在区间中的出现次数,这里直接选择用 vector 存下每一个颜色的序列,然后在对应颜色的 vector 中二分左右端点,下标之差即为出现次数。
#include <cstdio>
#include <algorithm>
#include <vector>
#include <random>
const int N = 50005;
int n, m;
int c[N];
std::vector<int> vec[N];
inline int calc(int l, int r, int c)
{
return std::upper_bound(vec[c].begin(), vec[c].end(), r) - std::lower_bound(vec[c].begin(), vec[c].end(), l);
}
std::mt19937 rng(114514);
int main(void)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n;++i)
scanf("%d", c + i), vec[c[i]].push_back(i);
for (int i = 1, l, r; i <= m;++i)
{
scanf("%d%d", &l, &r);
int ans = 0;
for (int j = 1; j <= 40; ++j)
{
int t = rng() % (r - l + 1) + l;
int cnt = calc(l, r, c[t]);
if(cnt * 2 > r - l + 1)
{
ans = c[t];
break;
}
}
printf("%d\n", ans);
}
return 0;
}