POJ 3368 Frequent values(RMQ/线段树区间合并)

头歌 DNS协议分析第3关----DNS 报文分析 DNS 报文分析 阅读详情

题目地址:点击打开链接


题意:给定一个数组,其中的元素满足非递减顺序,要求对于一对起点和终点,回答出其中某个元素重复出现的最大次数。


思路:

由于原数列已经排好序,所以相同的数字一定是在一起的。我们可以O(n)扫描一遍,算出每一个位置上的数字num是从左起第几个num,记为num[i]

    如样例,扫描后如下,括号内是num数组值

    -1(1)  -1(2)  1(1) 1(2) 1(3) 1(4) 3(1) 10(1) 10(2) 10(3)

    这样似乎直接求num数组区间[l,r]内的最大值就能得到答案。实际上这样无法得到正确的结果,因为如果查询区间左端点上num值不等于1,就会得到错误的答案。如对样例求[5,7]会得到4。

    出现这个错误的原因上面已经说了,因为num数组是对区间[1,n]的计数。

    解决方法也很简单,在O(n)倒着扫一遍,对于每个位置上的数字num,求出最右侧的数字为num的位置,记为R[i],如下

     -1(2)  -1(2)  1(6) 1(6) 1(6) 1(6) 3(7) 10(10) 10(10) 10(10)

    这样查询[l,r]时,只要R[l] < r,就使用RMQ查询[ R[l]+1 , r ]区间内的最大值,这样可以保证查询区间的左端点num值一定是1。而对于[l , R[l] ]这段区间,很显然R[l] - l + 1是唯一一个可能的答案。

    当R[l] >= r时,显然[l, r]整个区间都是同一个数字。答案为r-l+1.



这个解法的关键是numl数组记录该位置以左该数的数量,numr数组记录最右和自己相同数到哪。RMQ直接对numl查询(l , r)时左端点的区间可能不

完整,此时就可以用numr数组直接得到在(l , r)中与左端点相同的数数量,然后剩下的范围RMQ查询,取较大值。


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 1e5+5;
int dp[maxn][25], numl[maxn], numr[maxn], a[maxn], n, m;

void initRMQ()
{
    for(int j = 0; j < 25; j++)
        for(int i = 1; i <= n; i++)
        {
            if(j == 0) { dp[i][j] = numl[i]; continue; }
            int len = 1<<j;
            if(i+len-1 <= n)
                dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
        }
}

int RMQ(int l, int r)
{
    int k = (int)log2(r-l+1);
    return max(dp[l][k], dp[r-(1<<k)+1][k]);
}

int main(void)
{
    while(cin >> n, n)
    {
        cin >> m;
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        numl[1] = 1;
        for(int i = 2; i <= n; i++)
            numl[i] = a[i]==a[i-1] ? numl[i-1]+1 : 1;
        numr[n] = n;
        for(int i = n-1; i >= 1; i--)
            numr[i] = a[i]==a[i+1] ? numr[i+1] : i;

        initRMQ();
        while(m--)
        {
            int l, r;
            scanf("%d%d", &l, &r);
            if(numr[l] >= r) printf("%d\n", r-l+1);
            else printf("%d\n", max(numr[l]-l+1, RMQ(numr[l]+1, r)));
        }
    }
    return 0;
}

Frequent values
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 18434 Accepted: 6652

Description

You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.

Input

The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an (-100000 ≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the 
query.

The last test case is followed by a line containing a single 0.

Output

For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.

Sample Input

10 3
-1 -1 1 1 1 1 3 10 10 10
2 3
1 10
5 10
0

Sample Output

1
4
3

Source


5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配 本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。 阅读详情

相关推荐

【GAMES101】现代计算机图形学入门 资料整理

课程网址 课程主页 包括ppt 课程PPT和视频 一篇搞定!GAMES101现代计算机图形学入门(全) 作业链接地址 作业论坛 GAMES101课程环境搭建(Win10+VSCode) 计算机图形学笔记 虎书pdf 提取:n2rx 【必须】:高等数学(微积分、线性代数)、算法、数据结构 【非必须】:信号处理、数值分析、大学物理(光学) 在线公式编辑器 一定要做作业,如果个人要配置环境的话应该是配置opencv,eigen这两个核心库就行了,目前觉得最核心的一个作业是作业3,实现着色器和渲染管线,做完一遍

ysh的博客 2684

线段树之区间第k大查询 C/C++ 区间暴力归并 思路+代码

线段树之区间第k大查询 C/C++ 一、思路 我们都知道线段树中每个结点都维护着序列上的某个区间,可以是维护区间最值、区间和、最大公约、最小公倍等。那么区间第k大该怎么维护呢? 有人说:让线段树中结点去维护保存相应区间的排序后的序列不就好了。没错 ...

qq_42323056的博客 958

3DSlicer冠脉分割实战:从DICOM导入到三维重建的完整流程(附常见问题解决)

本文详细介绍了使用3DSlicer进行冠脉分割的完整流程,从DICOM数据导入到三维重建,涵盖环境配置、视图优化、心脏区域分割及冠脉精细分割等关键步骤。针对常见问题提供实用解决方案,帮助医学影像从业者高效完成心血管结构分析,提升诊断准确性。

weixin_29271053的博客 631

hdu1540线段树区间合并

题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。线段树功能:单点修改,区间求值。分析: pre数组记录区间左端点开始的最大连续个数, suf数组记录区间右端点开始往左的最大的连续个数,sum数组表示该区间最大的连续点的个数。父亲区间内的最大区间必定是,左子树最大区间,右子树最大区间,左右子树合并的中间区间,三者中最大的区间值 #i

skymeteorite 494

BEVFormer详解

BEVFormer 是将Transformer架构的自注意机制与BEV视图中3D检测结合起来的一种纯视觉目标检测方案。对于纯视觉的BEV检测方案,其中的重中之重就是如何将2D的图像特征映射到3D空间的BEV栅格,既然是映射关系,那就有前行投影和反向查询两种机制。前向投影是基于深度估计的方法,参考基于深度估计的BEV视图转换方法,典型代表为LSS。反向查询方法思路为先将BEV栅格在Z方向上进行lift提升,然后再映射到图像特征图上进行特征查询。BEVFormer 就是基于这种机制进行2D图像特征到3D空间的B

MAX的专栏 4747

IC版图设计之OASIS文件格式详解

OASIS(Open Artwork System Interchange Standard)是继GDSII之后新一代的集成电路版图数据交换标准,由SEMI在2004年正式发布(SEMI标准号:SEMI P39)。高压缩率:相比GDSII可减少3-10倍文件体积扩展性强:支持纳米级工艺的复杂图形描述跨平台兼容:独立于EDA工具和操作系统安全增强:内置校验和与加密支持。

ZZcppc的博客 2448

poj2104

先读入所有数据,离散一遍 从1-n给每个点建立一颗线段树,若询问区间l-r的第k大,则只要让【第r棵树一段前缀区间内点的个数】-【第l-1棵树一段前缀区间内的点的个数】=k(实际上有可能不是等于,而是大于等于,因为可能存在多个相同的数),该区间最后一个数即为答案 #include<cstdio> #include<cctype> #include&lt...

100

C++程序发生内存越界,一定会导致程序崩溃吗?详解内存越界

内存越界是否一定会导致程序崩溃吗?详解内存越界

dvlinker的技术专栏 1万+

HDU5107---K-short Problem (线段树区间 合并、第k大)

题意:二维平面上 N 个高度为 Hi 建筑物,M次询问,每次询问输出 位于坐标(x ,y)左下角(也就是xi <= x && yi <= y)的建筑物中的第k高的建筑物的高度,如果不存在输出-1. 思路:可以发现k很小,最大才是10。对于区间第k大的问题,如果k很小的话,线段树也是可以的,,当然这里要用到 区间合并,对于每个节点 记录其 孩子中 前2*k个高度(不一定...

weixin_30514745的博客 139

嵌入式软件工程师面试题目整理(一)

文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?为什么2440的内存起始地址是3后面7个0呢?为什么6410的内存起始地址是5后面7个0呢?内存管理有什么看法?(MMU)锁有哪些?有什么注

嵌入式与Linux那些事的博客 7883

【音视频】PJSIP库——示例简介、C++类说明

aectest音频回声消除测试工具,用于演示音频处理模块中的回声消除(AEC)功能,通常用于 VoIP 场景中优化语音质量。auddemo音频播放 / 录制演示,展示如何使用 PJProject 的音频接口进行基本的音频数据采集、播放和处理,例如波形显示或格式转换。stereotest立体声处理测试,可能用于演示多声道音频的处理方式,如混音、声道分离等。tonegen音频信号生成工具,用于生成测试用的音频信号(如正弦波、音调等),常用于音频设备测试或调试。recfile。

郭老二 434

POJ - 3368 Frequent values RMQ或线段树

题目链接:点击查看 题意:n个数,q次询问,区间(l,r) 连续出现的数最多的次数 题解:1、RMQ,保存区间的最大值,但先要把前面和a[l-1]相同的数去掉,对于特殊的数据也是会T的(比如n个数全都相同),这里主要是学习下方法; 2、线段树维护区间最大值,直接就是nlog(n) RMQ: #include <iostream> #include <cstdio&gt...

还我笑颜 205

【肝帝一周总结:全网最全最细】十万字python教程,学不会找我!教到你会为止!!内容超多,建议收藏慢慢看!

文章目录前言一定要看python入门python缩进Python注释Python 变量1. 定义理解2. 变量名命名3. 分配多个值4. 输出变量5. 全局变量 前言一定要看 python能干什么?有什么用?好处在哪?不要我讲了,这不是我在博客该讲的,言简意赅就是:通俗易懂,上手快,实用强。我会根据自己个人理解以及国外官网翻译为中文对大家进行讲解。完整源码我也会在最下面带上地址。内容过多,我不会全部演示,你完全可以复制粘贴到自己的pycharm上运行即可。 不管是国内的菜鸟教程还是我在这里的翻译,至少你跟

全栈川川 5万+

poj3368——Frequent values

部分内容参考自:https://www.cnblogs.com/frog112111/p/3306280.html 题目链接:http://poj.org/problem?id=3368 题目大意:给定一个数列以及一些操作,每次操作给定一对[l,r],求出该区间中出现数最多的次数。 我们可以分析一下数据范围: 其中n表示数的个数,q表示操作个数。 于是复杂度大约在O(n)——O(nlog...

weixin_30580341的博客 145

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Frequent values POJ - 3368(线段树,区间合并)

Frequent values POJ - 3368 题目链接 题意:一个非递减序列,随机询问区间[l, r]中出现次数最多的数的出现次数; 思路:多次询问,首先就要想一下线段树;由题意可知数列中的数是连续的,既然是连续的就有合并的希望!!!那么就来一发线段树吧(RMQ也可以做,但是不会啊!!!还是蒟蒻); 首先,要用线段树维护哪些值? 题目要求区间内出现次数最多的数的出现...

Sirius_han的博客 365

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

POJ 3368 Frequent values 线段树 || RMQ

题目:http://poj.org/problem?id=3368 题意:给定一个非递减数组,然后有一些查询,询问区间内出现次数最多的数的次数 思路:没想到用RMQ怎么做,用线段树的话,类似于之前做过的一题,要区间合并,好恶心。最后l

弱智就要多努力 454

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BZOJ 4552 排序(二分 || 线段树合并)

题意:对一个1~n的全排列, 进行m次局部排序 (0, l, r)将区间[l, r]数字升序排列 (1, l, r)将区间[l, r]数字降序排列 仅一次询问, 询问m次局部排序后第q位置上的数字 1 ≤ n, m, q ≤ 1e5 思路: 这题有个神奇的做法,我们可以直接二分答案x,然后把大于等于x的都看作1,比x小的都看作0插入线段树中, 然后执行m个询问,因为数组中

CillyB的博客 1179

POJ 2182 Lost Cows (树状数组+二分 / 线段树 / 枚举)

给出n和每个数之前比它小的数有几个 需要输出原序列,最后一个数的真实值为a[N]+1 将a[N]+1在序列中删去,更新a[i],那么第N-1个数的真实值为a[N-1]+1。 做法很多,线段树,树状数组加二分或是枚举都可以。 线段树代码: #include #include #include using namespace std; const int maxn

CillyB的博客 1029

HDU 6162 Ch’s gift(树链剖分+线段树)

题意:给你一颗树,每个节点有一个值,q次询问,每次询问u到v的路径上节点权值在a至b的节点的权值和。 n,q 思路:可以离线处理,分别求出路径中 代码: #include using namespace std; typedef long long ll; const int maxn = 1e5+5; int deep[maxn], fa[maxn], top[maxn]

CillyB的博客 818

HDU 6183 Color it(线段树 动态开点)

题意:有④种操作:①1 x y c表示在(x, y)点染上颜色c;②2 X y1 y2表示查询在(1, y1)到(X, y2)范围内有多少种不同的颜色;③0表示清屏;④3表示程序退出(0 思路:因为只有50种颜色,所以我们可以分别考虑每个颜色,x轴每次都是询问的[1,x],所以我们开50棵线段树,对于 每种颜色维护每个y坐标的最小x,查询的时候就是区间查询[y1,y2]的最小x是否小于

CillyB的博客 729

SDUT 2880 Devour Magic(线段树lazy和set标记模板)

题意:给你一个1~n的区间,每过一个单位时间区间值加一 现在有一个操作 t l r 表示在t时间把 l到r这个区间的的值累加到ans,然后把这段区间清零 思路:以前没做过把一段区间置为某个数的题,涨姿势了,可以和lazy标记类似做一个set标记。 #include #include #include #include using namespace std; typede

CillyB的博客 673

HDU 5029 Relief grain(树链剖分+线段树)

题意:给你一颗n个节点的树,现在执行m次操作,每次操作[a, b, k]表示a到b的路径上的所有点都加上一个颜色k。 m次操作之后输出每个点的出现次数最多的那个颜色(若有多个颜色输出值最小的)。n, m, k 思路:我们可以先把他想成在区间上执行操作,这样题意就变成了: 一个区间[1, n],m次操作[a, b, k],表示a-b区间每个节点添加一个颜色k,mci曹组后输出n个数,

CillyB的博客 624

HDU 6070 Dirt Ratio(二分+线段树)

题意:给你一个长度为n的数组,让你求size(l, r)/(r-l+1)的最小值。[l, r]是给定数组一个子序列,size(l, r)的值为这个区间的不同数的个数。(n 官方题解: 二分答案midmid,检验是否存在一个区间满足\frac{size(l,r)}{r-l+1}\leq mid​r−l+1​​size(l,r)​​≤mid,也就是size(l,r)+mid×

CillyB的博客 615

BZOJ 4756 Promotion Counting(线段树合并 || dfs)

题意:给你一棵n个节点的树,根为1,问你每个节点,它的子树中有几个节点比它大。 思路: 有一个简单的方法是可以遍历一下这棵树,树状数组维护,对于每个点的答案为 子树节点个数-(遍历它后比它小的数的个数-遍历它前比它小的数的个数)。遍历完它的子树节点后把它插入树状数组。 还有一个方法是对于每个节点建立一颗权值线段树,然后自底向上合并,每次合并后就可以直接查找比它大的数的个数,因

CillyB的博客 613

BZOJ 2212 & POI 18 Tree Rotations(线段树合并)

题意:给定一棵2n-1个节点的二叉树, 每个叶子上有1~n的数字, 保证每个数字出现且仅出现一次  允许任意次交换某两棵兄弟子树  对交换完毕的树求先序遍历, 形成1~n的一个排列  求这个排列最小的逆序对个数  1 ≤ n ≤ 2 * 1e5 (1e6) 思路:子树x内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右

CillyB的博客 585

Educational Codeforces Round 23 F. MEX Queries(线段树区间设值)

题意:一个无限长的序列,q次操作,有三种操作: 1 l r : 将区间[l, r]设为1 2 l r : 将区间[l, r]设为0 3 l r : 将区间[l, r]的数反转(0变1, 1变0) 每次操作后输出最小的为0的位置下标 (q 思路:前两个操作就是基础的线段数区间设置操作,关键是操作3怎么实现,线段树每个节点维护的是区间和,如果我们将它的区间反转,那和就变成了区间长

CillyB的博客 571
上一篇: POJ 3264 Balanced Lineup (区间最值 RMQ模板/线段树)
下一篇: POJ 1050 To the Max(dp 最大子矩阵和/最大子段和问题)
cillyb
博客等级 码龄11年 225粉丝 497原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值