原题地址:https://loj.ac/problem/6285
题意:给出一个长为 n 的数列,以及n 个操作,操作涉及询问区间的最小众数。
思路:这题拖了好几天了。
看hzwer博客说,可以看《区间众数解题报告》,专门介绍了如何求解区间上的众数。
仔细研究了一下,确实讲的好细。
PS:解法一和解法二的时间差距还是很明显的
解法一:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int mod = 10007;
int n, block, belog[maxn], l, r, m;
int a[maxn], t[maxn], really[maxn]; //a是原数组,t是拷贝数组,really[i]=j,表示经过离散化的数字i的原数是j
int dp[1000][1000];//dp[i][j]表示第i块到第j块的众数是多少(注意此题是经过离散化的众数)
vector<int>v[maxn];//存的数字i的分别位于哪些位置
int num[maxn];
inline int read() {
//读入挂
int ret = 0, c, f = 1;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -1, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
if(f < 0) ret = -ret;
return ret;
}
void init(int x) { //预处理第i块到第j块的众数是几
int Max_num = 0;//当前众数的数量
memset(num, 0, sizeof(num));
int