LOJ #6285. 数列分块入门 9(求区间众数的非优化和优化版本)

该博客讨论了LOJ #6285题目,涉及在数列中求区间众数的问题。作者分享了研究《区间众数解题报告》的心得,并对比了两种不同的解法:一种未优化,另一种通过预处理实现空间换时间的优化,显著提高了效率。
摘要由CSDN通过智能技术生成

原题地址: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值