poj 3368 Frequent values 解题报告
题目链接:http://poj.org/problem?id=3368
题目意思:给出一段 n 个数的序列你,对于区间 [l, r] 的询问,找出 出现频率最高的数的次数。考虑到序列中的数是非递减的,也就是相同的数会连续不间断地在一起,于是就才有了代码中这个部分来预判了:
if (s > t)
printf("%d\n", ans);
这个人写RMQ 写得不错:http://dongxicheng.org/structure/lca-rmq/
这题就是套模板的,纪念第一个RMQ ^_^! 搞了整个晚上= =,懂了一点了,终于.......
详细请看代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int MAXN = 1e5 + ; int a[MAXN], b[MAXN];
int dp[MAXN][]; // dp[i][j] 实质对应别人的F[i, j] //dp[i][j]: 从 i 起连续2^j个数中的最大值
void makeRMQ(int n, int b[])
{
for (int i = ; i < n; i++)
{
dp[i][] = b[i];
// printf("dp[%d][0] = %d\n", i, dp[i][0]);
}
for (int j = ; (<<j) <= n; j++) // 2*j <= n
{
for (int i = ; i+(<<j)- < n; i++) // i+2*j-1 <= n
{
// printf("before: dp[%d][%d] = %d, dp[%d][%d] = %d\n", i, j-1, dp[i][j-1], i+(1<<(j-1)), j-1, dp[i+(1<<(j-1))][j-1]);
dp[i][j] = max(dp[i][j-], dp[i+(<<(j-))][j-]); // F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1])
// printf("after: dp[%d][%d] = %d\n", i, j, dp[i][j]);
}
}
} int rmq(int s, int v)
{
int k = (int)(log(v-s+1.0) / log(2.0));
return max(dp[s][k], dp[v-(<<k)+][k]); // RMQ(A, i, j)=min{F[i,k],F[j-2^k+1,k]}
// k=[log2(j-i+1)]
} int find(int s, int t) // 找到序列a中(下标从0开始)和a[t](下标从1开始)值相同的第一个数(从左往右)的下标
{ // 例如对于 3 7, 返回的是6,因为a[7] = 3,和3相等的原始序列第一次出现3的时候下标是6(从0开始)
int tmp = a[t]; // 再例如对于2 6,返回的是2,因为a[6] = 1,第一次出现1的时候是下标2
int l = s;
int r = t;
while (l < r)
{
int mid = ((l+r)>>);
if (a[mid] >= tmp)
r = mid;
else
l = mid + ;
}
return r;
} int main()
{
int n, q, s, t;
while (scanf("%d", &n) != EOF && n)
{
scanf("%d", &q);
for (int i = ; i < n; i++)
scanf("%d", a+i);
int tmp;
for (int i = n-; i >= ; i--)
{
if (i == n-)
tmp = ;
else
{
if (a[i] == a[i+])
tmp++;
else
tmp = ;
}
b[i] = tmp; // 代表从后往前数,连续相同的数有多少个
}
makeRMQ(n, b);
while (q--)
{
scanf("%d%d", &s, &t);
s--, t--; // 下标从0开始
int tmp = find(s, t);
int ans = t - tmp + ;
t = tmp - ;
// printf("ans = %d, t = %d\n", ans, t);
if (s > t)
printf("%d\n", ans); // 这个区间只有连续的一段数,例如 [2, 6] 只有[1 1 1 1]
else
printf("%d\n", max(ans, rmq(s, t))); // 要从两段区间里找(详细看链接),因为这个区间有多个连续的一段数,例如[1, 10]有[1 1 1 1] 和[10 10 10]
}
}
return ;
}
poj 3368 Frequent values 解题报告的更多相关文章
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- POJ 3368 Frequent values (基础RMQ)
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14742 Accepted: 5354 ...
- poj 3368 Frequent values(段树)
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13516 Accepted: 4971 ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- poj 3368 Frequent values -Sparse-Table
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16537 Accepted: 5981 Description You ...
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...
- poj 3368 Frequent values(RMQ)
题目:http://poj.org/problem?id=3368 题意:给定n个数,顺序为非下降,询问某个区间内的数出现最多的数的 出现次数.. 大白书上的 例题..算是RMQ变形了, 对 原数组重 ...
- (简单) POJ 3368 Frequent values,RMQ。
Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...
随机推荐
- 【HDOJ6222】Heron and His Triangle(Java,二分,递推)
题意:让你找这样的一个三角形,三条边为t,t-1,t+1,并且面积为整数,最后满足t大于等于n. n<=1e30 思路:直接推式子不会,打表找规律 f(n)=4*f(n-1)-f(n-2)(n& ...
- 从dataset表中获取某一列的所有值方法
原文发布时间为:2008-07-31 -- 来源于本人的百度文章 [由搬家工具导入] 可以datarow遍历所有行即可,如下:pubauthor这个表中的au_lname的所有值加到listbox上面 ...
- elasticsearch入门使用(二) Mapping + field type字段类型
Elasticsearch Reference [6.2] » Mapping 参考官方英文文档 https://www.elastic.co/guide/en/elasticsearch/refer ...
- 什么是 Linux 发行版
什么是Linux的发行版 就Linux的本质来说,它只是操作系统的核心,负责控制硬件.管理文件系统.程序进程等,并不给用户提供各种工具和应用软件.所谓工欲善其事,被必先利其器,一套在优秀的操作系统核心 ...
- java 基础 5 String StringBuffer StringBuilder
String是不可变的,原因 1是可以缓存hash值,因为String的hash值经常被使用,例如String用作HashMap等.不可变特性 使得hash值不变,因此只需要进行一次计算: 2Str ...
- kafka-0.8.1.1总结
文件夹 一. 基础篇 1. 开篇说明 2. 概念说明 3. 配置说明 4. znode分类 5. kafka协议分类 6. Kafka线 ...
- IntelliJ IDEA 默认需要进行maven的设置
IntelliJ IDEA 默认需要进行maven的设置 需要指定maven的地址,指定settings.xml的地址: 可以默认的在user/.m2/下面放一个settings.xml文件: 学习: ...
- Java 实现 淘宝秒杀 聚划算 自己主动提醒 源代码
说明 本实例可以监控聚划算的抢购button,在聚划算整点聚的时间到达时自己主动弹开页面(URL自定义). 能够自己定义监控持续分钟数,同一时候还能够通过多线程加快刷新速度. 源代码 package ...
- HTML5面试题-b
感谢分享 面试有几点需要注意: 面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方向↑. 题目类型: 技术视野.项目细节.理论知识型题,算法题,开放性题,案例题. 进行追问: 可以 ...
- C# 通过比对哈希码判断两个文件内容是否相同
1.使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码,然后比较两个哈希码是否一致. 2. 在比较文件内容的时候可以采用好几种方法.例如 ...