【POJ No. 3368】 最频繁值 Frequent values

news2024/11/29 10:40:17

【POJ No. 3368】 最频繁值 Frequent values

北大OJ 题目地址

在这里插入图片描述

【题意】

给定n 个整数的非递减序列a 1 , a 2 ,…, an ,对每个索引i 和j 组成的查询(1≤i ≤j ≤n ),都确定整数ai , …, aj 中的最频繁值(出现次数最多的值)。

【输入输出】

输入:

包含多个测试用例。每个测试用例都以两个整数n 和q(1≤n ,q ≤100000)的行开始。下一行包含n 个整数a 1 , …, an(-100000≤ai ≤100000,i ∈{1, …, n })。对每个i ∈{1, …, n-1},都满足ai ≤ai +1 。以下q 行,每行都包含一个查询,由两个整数i 和j 组成(1≤i ≤j ≤n ),表示查询的边界索引。在最后一个测试用例后跟一个包含单个0的行。

输出:

对每个查询,都单行输出一个整数,表示给定范围内最频繁值的出现次数。

【样例】

在这里插入图片描述

【思路分析】

这道题可以将元素的出现次数累计,然后进行区间最值查询,所以可以使用ST解决。

为提高求log的效率,首先用动态规划求出数据范围内所有数的log值,将其存储在数组lb[]中,使用时查询即可。F[i ][j ]表示[i , i +2 ^j -1]区间的最大值,区间长度为2 ^j 。

【算法设计】

① 求出数据范围内所有数的log值,将其存储在数组lb[]中。

② 非递减序列的相等元素一定相邻,将每个元素都和前面的元素比较,将重复次数累计并存入F[i ][0]中。

③ 创建ST。

④ 查询[l , r ]区间的最大值。若第l 个数和前一个数相等,则首先统计第l 个数在查询区间[l , r ]的出现次数,再查询剩余区间的最大值,两者再求最大值即可。

【举个栗子】

① 求出数据范围内所有数的log值,将其存储在数组lb[]中,规律如下。

  • 2^i 和它的前一个数&运算必然是0,此时其log值比前一个数增加1。例如8的二进制为1000,7的二进制为111,两者与运算为0,log(8)比log(7)增加1。
  • 除2 ^i 外,其他数和前一个数的与运算均不为0,其log值与前一个数相等。
首先,log[0]=-11&0=0:log[1]=log[0]+1=02&1=0:log[2]=log[1]+1=13&2=2:log[3]=log[2]=14&3=0:log[4]=log[3]+1=25&4=4:log[5]=log[4]=26&5=4:log[6]=log[5]=27&6=6:log[7]=log[6]=28&7=0:log[8]=log[7]+1=3。

……

② 将输入样例中元素的出现次数累计并存入F[i ][0]中。

在这里插入图片描述

③ 创建ST。

④ 查询。2 3:查询[2, 3]区间最频繁值的出现次数。首先,t=l =2,因为a [2]=a [1],t ++,即t =3;此时a [3]≠a [2],t -l=1,RMQ(t , r )=RMQ(3, 3)=1,求两者的最大值,得到[2, 3]区间最频繁值的出现次数为1。

注意:不可以直接查询RMQ(2, 3),为什么?

在这里插入图片描述

⑤ 查询。1 10:查询[1, 10]区间最频繁值的出现次数。首先,t =l =1,a [1]≠a [0],t -l =0,RMQ(t , r )=RMQ(1, 10)=4,求两者的最大值,得到[1, 10]区间最频繁值的出现次数为4。

⑥ 查询。5 10:查询[5, 10]区间最频繁值的出现次数。首先,t =l =5,因为a [5]=a [4],t ++,即t =6;a [6]=a [5],t++,即t =7;此时a [7]≠a [6],t -l =2,RMQ(t , r )=RMQ(7,10)=3,求两者的最大值,得到[5, 10]区间最频繁值的出现次数为3。

在这里插入图片描述

若直接查询RMQ(5, 10)=4,但是a [5]在[5, 10]区间的出现次数是2,则不是4。因此若a [l ]和前一个数a [l -1]相等,则需要先统计a[l ]在[l , r ]区间的出现次数,再查询剩余区间的最值,比较两者的最大值。

【算法实现】

#include<cstdio>
#include<algorithm>

using namespace std;
const int maxn=100010;

int a[maxn];//数据 
int lb[maxn];//存储log值 
int F[maxn][20];//F(i,j)表示区间[i,i+2^j-1]的最值,区间长度为2^j

void Initlog(){//求解所有log值,保存到数组lb[] 
	lb[0]=-1;
	for(int i=1;i<maxn;i++)
		lb[i]=(i&(i-1))?lb[i-1]:lb[i-1]+1;
}

void ST_create(int n){//每个测试用例n不同,因此做参数 
	for(int j=1;j<=lb[n];j++)
		for(int i=1;i<=n-(1<<j)+1;i++)//n-2^j+1
			F[i][j]=max(F[i][j-1],F[i+(1<<(j-1))][j-1]);		
}

int RMQ(int l,int r){//求区间[l..r]的最值差 
	if(l>r) return 0;
	int k=lb[r-l+1];
	return max(F[l][k],F[r-(1<<k)+1][k]);
}

int main(){
	
	int n,q,l,r;
	Initlog();
	while(~scanf("%d",&n)&&n){
		scanf("%d",&q);
		for(int i=1;i<=n;i++){//下标从1开始 
			scanf("%d",&a[i]);
			if(i==1){
				F[i][0]=1;
				continue;
			}	
			if(a[i]==a[i-1])
				F[i][0]=F[i-1][0]+1;
			else
				F[i][0]=1;
		}
		ST_create(n);
		for(int j=1;j<=q;j++){
			scanf("%d%d",&l,&r);
			int t=l;
			while(t<=r&&a[t]==a[t-1])
				t++;
			printf("%d\n",max(t-l,RMQ(t,r)));
		}
	}
	
	return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jmeter工具下载并直连MySQL数据库

优秀链接&#xff1a; Jmeter汉化 Jmeter初认识 前提有JDK&#xff0c;我的是1.8 下载Jmeter 下载的Jmeter版本是5.5无需配置Jmeter路径&#xff0c;下载后解压便可以运行 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网下载比较慢&#xff0c;在…

[附源码]计算机毕业设计JAVA健身健康规划系统

[附源码]计算机毕业设计JAVA健身健康规划系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

ADPCM(自适应差分脉冲编码调制)的原理和计算

关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, G.723, G.726 中都会使用到 ADPCM G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. …

【Linux】linux中,你不得不爱的命令集(下)

我们将要介绍的命令并不是linux中所有的命令&#xff0c;是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7&#xff0c;我们的linux搭建是在腾讯云服务器上搭建的&#xff0c;借助Xshell登录服务器&#xff0c;在root下进行命令行的操作。 目录 mv指令&#x…

什么认证在云计算行业内的含金量最大?考试费用贵不贵?

作为一个新兴发展起来的技术&#xff0c;云计算在社会生产中的作用越来越重要&#xff0c;各家企业纷纷转型&#xff0c;希望能借用新技术&#xff0c;获得新的发展。这样一来市场就需要大量的新人才来维护运行&#xff0c;然而云计算作为新兴技术&#xff0c;还没有被大量引入…

野火FPGA入门(7):IP核调用

文章目录第24讲&#xff1a;快速开发的法宝&#xff1a;IP核第25讲&#xff1a;PLL-IP核的调用第26讲&#xff1a;ROM-IP核的调用rom_ctrl.vrom.v第27讲&#xff1a;RAM-IP核的调用key_filterram_crtlram第28讲&#xff1a;FIFO-IP核的调用同步FIFO异步FIFO第24讲&#xff1a;快…

Docker的四种网络模式和相关网络命令

一、Docker网络 1.实现原理 docker 使用linux 桥接&#xff0c;在宿主机虚拟一个docker 容器网桥&#xff08;docker0) &#xff0c;docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker 网桥是每个容器的…

建议别瞎卷,GitHub乱杀,MySQL DBA 攻坚指南一出,阿里数据库专家都解脱了

我先叭叭哈~ 大家可能并不觉得&#xff0c;数据库其实非常重要&#xff0c;每个业内巨头&#xff0c;每个成熟的互联网产品都有多个数据库系统&#xff0c;能保证大量并发场景下不出错&#xff0c;并非易事。尤其是银行、电商、电信、电力、航空等实时交易重要的环境中&#x…

微服务远程调用组件Feign的使用详解

一. 概要 我们知道&#xff0c;现在最火且最有技术含量的技术莫过于SpringCloud微服务了&#xff0c;所以今天百泽老师就带大家来学习一下微服务的核心的组件之一&#xff0c;Feign的基本使用及其工作机制。 二. Feign简介 1.概念 在学习Feign的使用之前&#xff0c;我们先…

贝赛尔曲线

<template><svg width"400" height"400" class"BG" mousemove"mousemove"><!-- 这样拼字符串&#xff0c;少些点加号&#xff0c;方便改一些 --><path class"Line":d"M${StartPoint[0]} ${StartP…

CNN经典模型之ALexNet、ResNet、DenseNet总结和比较

目录 ALexNet(2012 研究背景 思路和主要过程 网络模型 数据增强 主要贡献点 ResNet(2015 研究背景 思路和主要过程 Residual block(残差块)和shortcut connections(捷径连接) bottleneck block-瓶颈模块 主要贡献点: Denset(2017 研究背景 思路和主要过程 Dense…

mysql忘记密码怎么解决(几乎囊括你可能遇到的所有问题)

mysql忘记密码解决&#xff1a; 多次输入都错误&#xff0c;出现下面的提示 Access denied for user rootlocalhost (using password: YES)解决&#xff1a; 1.关闭mysql service mysqld stop2.mysql停止后输入 mysqld --shared-memory --skip-grant-tables3.重新打开一个…

利用Pinpoint搭建全链路监控系统

随着项目微服务的进行&#xff0c;微服务数量逐渐增加&#xff0c;服务间的调用也越来越复杂&#xff0c;我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪&#xff0c;而通过调研多个开源APM工具后&#xff0c;最终我们选择了Pinpoint。 简介 Pinp…

PyQt5 QDialog对话框(QMessageBox,QInputDialog,QFontDialog,QFileDialog,QColorDialog)

PyQt5 QDialog对话框QDialog类图QDialogQMessageBoxQInputDialogQFontDialogQFileDialogQColorDialogQDialog类图 QDialog import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtCore import Qtclass MyDialogWindow…

数据结构之插入排序

插入排序 一种思想我们所在指向位是需要进行插入的数据 我们锁指向位置前的数据是被插入的数据组 我们根据与前面的数据元素一个个比较来确定插入位置的排序 比如现在的76比前面的97小&#xff0c;97进行一个右移&#xff0c;就是赋值给data[4]&#xff08;我这里猜测是76应该是…

QT 介绍

QT 介绍 Qt是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#xff0c;当然也可以开发不带界面的命令行&#xff08;Command User Interface&#xff0c;CUI&#xff09;程序。且完全面向对…

项目实战——匹配系统(上)

ps&#xff1a;从这篇文章开始&#xff0c;整个项目最精华&#xff08;困难&#xff09;的部分就要来了&#xff0c;因此这里会把每一个步骤细分&#xff0c;并且说一下自己对于每个步骤的思考和理解&#xff08;博主水平有限&#xff0c;错误在所难免&#xff0c;欢迎指出讨论…

MyBatis-Plus(第一篇开山篇)

MyBatis-Plus&#xff08;第一篇开山篇&#xff09; 目录MyBatis-Plus&#xff08;第一篇开山篇&#xff09;结论&#xff1a;使用mybatis plus步骤1.导包2.整合(修改spring-dao配置文件)3.使用3.1 javaBean3.2 mapper层3.3 service层3.3.1 service接口3.3.2 service实现类3.4 …

【MEF:深度感知增强(细节增强:色彩映增强)】

Multi-exposure image fusion via deep perceptual enhancement &#xff08;基于深度感知增强的多曝光图像融合&#xff09; 多曝光图像融合 (MEF) 是通过将具有不同曝光的多个镜头集成在一起来解决此问题的有效方法&#xff0c;这在本质上是一个增强问题。在融合过程中&…

IDEA最实用的设置

​ 目录 全局设置 全局设置 选择 Configure->settings进入设置界面 1.设置主题 2.设置编码区的字体及大小 3.设置控制台的字体及大小 4.修改编码方式 解决有时我们在导入项目时&#xff0c;代码中的中文注释变成乱码问题。 5.设置按住Ctrl鼠标滚轮改变字体大小 6.设置…