uva 11235 - Frequent values(RMQ)
2015-07-21 18:00
483 查看
题目链接:uva 11235 - Frequent values
题目大意:给定一个非降序的整数数组。要求计算对于一些询问(i,j)。回答ai,ai+1,…,aj中出现最多的数出现的次数。
解题思路:由于序列为非降序的。所以同样的数字肯定是靠在一起的,所以用o(n)的方法处理处每段同样数字的区间。然后对于每次询问:
num[i]=num[j]:j−i+1
numi≠numj:max(RMQ(righti+1,reftj−1),max(righti−i+1,j−leftj+1))
题目大意:给定一个非降序的整数数组。要求计算对于一些询问(i,j)。回答ai,ai+1,…,aj中出现最多的数出现的次数。
解题思路:由于序列为非降序的。所以同样的数字肯定是靠在一起的,所以用o(n)的方法处理处每段同样数字的区间。然后对于每次询问:
num[i]=num[j]:j−i+1
numi≠numj:max(RMQ(righti+1,reftj−1),max(righti−i+1,j−leftj+1))
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5+5; int N, Q, num[maxn], rmq[maxn][20]; int left[maxn], right[maxn]; void RMQ_init () { memset(rmq, 0, sizeof(rmq)); for (int i = 1; i <= N; i++) rmq[i][0] = right[i] - left[i] + 1; for (int j = 1; (1<<j) <= N; j++) { for (int i = 1; i + (1<<j) - 1 <= N; i++) rmq[i][j] = max(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]); } } void init () { for (int i = 1; i <= N; i++) scanf("%d", &num[i]); left[1] = 1; for (int i = 2; i <= N; i++) { if (num[i] == num[i-1]) left[i] = left[i-1]; else left[i] = i; } right = N; for (int i = N-1; i >= 1; i--) { if (num[i] == num[i+1]) right[i] = right[i+1]; else right[i] = i; } RMQ_init(); } int RMQ (int L, int R) { if (L > R) return 0; int k = 0; while (1<<(k+1) <= R-L+1) k++; return max(rmq[L][k], rmq[R-(1<<k)+1][k]); } int main () { while (scanf("%d%d", &N, &Q) == 2 && N) { init(); int x, y; for (int i = 0; i < Q; i++) { scanf("%d%d", &x, &y); if (num[x] == num[y]) printf("%d\n", y - x + 1); else printf("%d\n", max(RMQ(right[x]+1, left[y]-1), max(right[x] - x + 1, y - left[y] + 1))); } } return 0; }
相关文章推荐
- iOS获取UUID,并使用keychain存储
- ios – 使用UINib加载xib文件实现UITableViewCell
- hdu5288OO’s Sequence
- iOS6新特征:UICollectionView介绍(二)
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
- C#高级编程四十四天-----string和stringbuilder
- String、StringBuffer与StringBuilder之间区别
- Android 性能优化的方法总结---UI篇
- hdu(2062)-Subset sequence 组合数学
- 设计模式-建造者模式(Builder)
- EasyUI-初级使用
- EasyUI-初级使用
- 10.根据主类,完成Compare类,该类有两个boolean类型的方法,方法isSameNum用来比较两组数是否完全相同,方法isSameSum用来比较两组数的和是否相等。相同或者相等返回true,
- iOS 自定义UISlider
- duilib中添加自定义控件之后怎么能够在xml文件中配置使用
- Leetcode #62 Unique Paths
- iOS UIView和CATransition的动画实现
- Android_UI开发详解之ActionBar
- POJ-1458-Common Subsequence-动规最长公共子序列
- request.getContextPath()