UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)
题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数。
分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 1 3,构造出“数量数组”,这个数组实际上就是已经将原来区间分了块,但是问询的区间不可能就是这些“数量数组”构成的"块",不过先来想想问询的区间可不可能包含这里面的某些"块"?很显然是有可能的,那么从这些"块"中找出最大值显然就是经典的RMQ问题,用ST可以预处理并解决,但是对于不是这些"块"的该怎么办呢?还是从这些"块"入手,首先先给这些"块"升序编号,对于这些"块"我们可以知道在原来区间当中其左右端点,比如1 1 2 3 3 3,我们可以分成① ② ③三块,值分别是2、1、3,第一块的左端点是原区间的1,右端点是2,同理第二块左右端点都是3,第三块左右端点是4和5,这样做便构成了“数量数组”下标和原数组下标的一个映射,对于问询(L, R)我们能够知道L属于那一块,那么这一个块在(L,R)这个区间内贡献的相同的值的元素个数就是=>L所在的块的右端点 - L + 1(这里记作val_L),对于R也是同理可以得到val_R,那么最后答案就是 ans = max( RMQ(L和R之间包含的完整的块), max(val_L, val_R))。不过需要注意的是,如果此时L R同在一个块中的话,那么答案就是R-L+1了!
#include<bits/stdc++.h>
using namespace std;
;
];
int cnt[maxn], L[maxn], R[maxn], num[maxn], tot;
inline void RMQ_init()
{
; i<tot; i++) dp[i][] = cnt[i];
; (<<j)<=tot; j++){
; i+(<<j)-<n; i++){
dp[i][j] = max(dp[i][j-], dp[i+(<<(j-))][j-]);
}
}
}
int RMQ(int L, int R)
{
;
;
<<(k+)) <= R-L+) k++;
<<k)+][k]);
}
int main(void)
{
while(~scanf("%d", &n) && n){
scanf("%d", &q);
memset(cnt, , sizeof(cnt));
memset(L, , sizeof(L));
memset(R, , sizeof(R));
tot = ;///表示"块"的个数
int Last;
; i<n; i++){///接下来对原区间的每一个元素进行映射处理
scanf("%d", &arr[i]);
){
Last = arr[i];///记录当前“块”的具体值
L[tot] = i;///当前“块”的左端点是i
}
if(arr[i] == Last){///如果元素还是属于上一个“块”
cnt[tot]++;///“块”里面的元素+1
num[i] = tot;///当前下标i对应了tot这个块
R[tot] = i;///更新右界
}else{
tot++;///有不同于之前的元素出现了,就相当于出现了新的“块”给其一个编号
cnt[tot]++;///tot“块”内元素+1
Last = arr[i];
num[i] = tot;
L[tot] = R[tot] = i;
}
}
tot++;
RMQ_init();///O(nlogn)的预处理
while(q--){
int Left, Right;
scanf("%d %d", &Left, &Right);
Left--, Right--;
if(num[Left] == num[Right]){///如果同属一个“块”,则答案就是R - L + 1
printf();
continue;
}else{
, num[Right]-),
max(R[num[Left]]-Left+, Right-L[num[Right]]+));
printf("%d\n", ans);
}
}
}
;
}
UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)的更多相关文章
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- UVA 11235 Frequent Values ---RMQ
大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- UVA 11235 Frequent values(RMQ)
Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...
- UVA - 11235 Frequent values
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- POJ 3368 & UVA 11235 - Frequent values
题目链接:http://poj.org/problem?id=3368 RMQ应用题. 解题思路参考:http://blog.csdn.net/libin56842/article/details/4 ...
- 数据结构(RMQ):UVAoj 11235 Frequent values
Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. I ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
随机推荐
- 【Qt开发】QTextEdit 外观属性设置
一.给QTextEdit添加背景图片,有下面两种方法: QTextEdit* iEdit = new QTextEdit(); 1:使用样式表: iEdit->setStyleSheet(&q ...
- echats--》饼图 如何在环形中央设置 文字?
遇到一个需求,在环形图中央空白部分显示总数量. let data = { totalNum: "", data: [ { val ...
- c++ release和debug语句分离
#ifdef _DEBUG a=1; #else a=2; #endif
- CDH管理节点扩容磁盘步骤
把4个节点加12G内存,把hive的heap调到6G,按group重启服务让配置生效 注: 停服务前在yarn的application webui查flink的application id yarn ...
- 小记---------关于linux 定时任务crontab
linux的crontab定时任务 启动服务: service crond start 关闭服务: service crond stop 重启服务: service crond ...
- Tomcat使用时出现的问题总结
1.有两种办法解决Tomcat启动时端口号冲突问题 1.第一种: 查看本地端口使用情况,找到被占用的8080端口,杀死该进程 1.查看本地端口命令:cmd->netstat -ano 2.找到 ...
- python__基础数据类型
字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台 ...
- Linux的用户与用户组(权限管理)
linux用户与用户.权限管理 用户管理: 1.useradd 创建用户 -c 指定用户描述 -d 指定家目录 默认家目录 /home下同名的目录 -g 指定主组 -G 指定附加组 [注意:一个用户主 ...
- Node.js FS模块方法速查
1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...
- 为Xcode配置Git和Github
Xcode.Git和Github是三个伟大的编程工具.本文记录一下如何在Xcode中使用Git作为源代码控制工具,以及如何将本地的Git仓库和远程Github上的仓库集成起来. 1. 如何为新建的Xc ...