UVA 11235Frequent values(RMQ)
训练指南P198
题意:给出一个非降序排列的整数数组a1, a2…… an,你的任务是对于一系列询问(i,j),回答ai, ai+1 ……aj 中出现的次数最多的次数
这题不仅学到了rmq的应用还学到了游程编码
对于一组数 -1, 1, 1, 2, 2, 2, 4就可以编码成(-1, 1), (1, 2), (2, 3), (4, 1),其中(a, b)表示 b 个连续的 a,cnt[i]表示第 i 段中数出现的次数。num[p] 表示p位置的数所在的段的标号, left[p]表示p位置的数所在段的左边那个数的下标, right[p]表示p位置的数所在段的右边那个数的下标。
那么对于查询(L, R)的结果就是下面三个中的最大的 从 L 到 L 所在段的结束出的元素(right[l] - l + 1)这里都是与L处的数相等的,然后从r所在的段开始到r处的元素的个数( r - left[r] + 1) 都是与r处相等的,然后还有中间的 (num[l] + 1, num[r] - 1)段的cnt的最大值
- #include <cstring>
- #include <algorithm>
- #include <cstdio>
- #include <string.h>
- #include <iostream>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int Max = + ;
- int n, m, tot;
- int num[Max], Right[Max], Left[Max], cnt[Max];
- int dp[Max][];
- //dp[i][j] 表示 i 段开始长度为2^j长度的区间
- void RMQ_init()
- {
- memset(dp, , sizeof(dp));
- for (int i = ; i <= tot; i++)
- dp[i][] = cnt[i];
- for (int j = ; ( << j) <= n; j++) // 这里的长度 是 n 是整个区间内的全部元素,
- {
- for (int i = ; i + ( << j) - <= tot; i++) //
- {
- dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - )) ][j - ]);
- }
- }
- }
- int RMQ(int l, int r)
- {
- if (l > r)
- return ;
- int k = ;
- while ( << (k + ) <= (r - l + ))
- k++;
- return max(dp[l][k], dp[r - ( << k) + ][k]);
- }
- int main()
- {
- while (scanf("%d", &n) != EOF && n)
- {
- scanf("%d", &m);
- memset(num, , sizeof(num));
- memset(Right, , sizeof(Right));
- memset(Left, , sizeof(Left));
- memset(cnt, , sizeof(cnt));
- int temp, last = INF;
- tot = ;
- for (int i = ; i <= n; i++)
- {
- scanf("%d", &temp);
- if (temp == last) // 如果与前面的数相等
- {
- num[i] = tot; // 当前位置的段号不变
- Right[tot]++; //当前段的右边的位置+1,
- cnt[tot]++; //当前段的元素个数+1
- }
- else //如果不与前面的数相等则开启一个新的段
- {
- num[i] = ++tot; // 段号++,
- cnt[tot]++;
- Left[tot] = Right[tot] = i; // 当前段的左右端点都是i
- last = temp; // 记录一下当前的元素
- }
- }
- RMQ_init();
- int l, r;
- while (m--)
- {
- scanf("%d%d", &l, &r);
- if (num[l] == num[r])
- {
- printf("%d\n", r - l + );
- continue;
- }
- printf("%d\n", max(RMQ(num[l] + , num[r] - ), max(Right[ num[l] ] - l + , r - Left[ num[r] ] + )));
- }
- }
- return ;
- }
UVA 11235Frequent 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 && 区间出现最多次的数的次数)
题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...
- POJ3368Frequent values[RMQ 游程编码]
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17581 Accepted: 6346 ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- poj3368Frequent values(RMQ)
http://poj.org/problem?id=3368 追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来..然后想RMQ 想出来了 算是离散吧 把每个数出现的次数以及开始的位置及结束的位 ...
- [poj3368]Frequent values(rmq)
题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 解题关键:统计次数,转化为RMQ问题,运用st表求解,注意边界. 预处理复杂度:$O(n\log n)$ ...
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...
随机推荐
- <![CDATA[的web使用简单说明
html.javascript会涉及到三个解析器,html解析器.xml解析器.javascript解析器.那么好了,问题来了,以上代码经常混编在一起,各自有各自的规则,终究会有冲突的,如下就是冲突. ...
- Android Weekly Notes Issue #219
Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...
- Android编码规范05
编码逻辑规范总结: 1.避免使用多个类放在一个文件里,除非是一次性使用的内部类 2.一个方法代码长度最好不要超过35行 3.原则上尽量不要修改自动生成的文件,如R文件 4.Final String 取 ...
- 关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友
关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可
- Eclipse for Java EE软件操作集锦(二)
看本文章之前请确保已经了解eclipse建立web工程,如果有疑问请查看本系列文章第一篇 eclipse软件操作集锦(一) 1.我们添加一个servlet 配置一下web.xml测试一下是否能正常显示 ...
- win7的6个网络命令
1 名称: Ipconfig 参数: /all : 显示详细信息 /renew: 更新所有适配器 /renew EL*:更新所有名称以EL为开头的连接 /release *Con*: 释放所有匹配的连 ...
- MS SQL巡检系列——检查重复索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
- T-SQL 实现行转列
问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id Value ColumnName 1 John FirstName 2 2 ...
- (转载)centos yum源的配置和使用
原文地址:http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html 一.yum 简介 yum,是Yellow dog Updater, ...
- [原创]最近使用React-Native的适配问题和警告搜集
主要记录一下最近使用RN 0.29.2版本遇到的适配的坑以及部分警告的解法. 适配类: 安卓输入框圆角.边框颜色.粗细等无法设置成功,需要在TextInput外面新增一个View设置圆角,TextIn ...