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 ...
随机推荐
- 【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat
原文:opencv之深拷贝及浅拷贝,IplImage装换为Mat 一.(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二种方式 这两种方式称 ...
- mysql——单表查询——聚合函数——示例
), km ), cj ) ); select * from score; ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ; 查询此同学的总成绩: ; ...
- chrome插件--安装以及问题记录
vue-devtools 插件网址下载 问题1 Vue.js is detected on this page. Devtools inspection is not available becaus ...
- linux c++ 实现http请求
main.cpp #include HttpReq.h #include <string.h> int main(void) { HttpRequest* Http; char http_ ...
- 第八周课程报告&&实验报告六
Java实验报告 班级 计科一班 学号 20188390 姓名 宋志豪 实验四 类的继承 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常. ...
- ideal项目启动及问题
Error running 'xxx项目' Command line is too long(idea版) 错误] Error running ‘xxx项目’: Command line is too ...
- Python爬虫之简单的爬取百度贴吧数据
首先要使用的第类库有 urllib下的request 以及urllib下的parse 以及 time包 random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url: ...
- SCUT - 492 - 鬼符「搦手的鬼畜生」 - 简单数学
https://scut.online/p/492 求[1,a]范围内的a模m的逆元的数量. 一开始用扩展欧几里得算法草了一发,WA了,当时不太清楚模非质数的周期,看来扩展欧几里得算法的笔记才知道要加 ...
- 七、for循环
for循环
- SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法.INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下 一.SQLite清空表 ...