训练指南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的最大值

  1. #include <cstring>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <string.h>
  5. #include <iostream>
  6. using namespace std;
  7. const int INF = 0x3f3f3f3f;
  8. const int Max = + ;
  9. int n, m, tot;
  10. int num[Max], Right[Max], Left[Max], cnt[Max];
  11. int dp[Max][];
  12. //dp[i][j] 表示 i 段开始长度为2^j长度的区间
  13. void RMQ_init()
  14. {
  15. memset(dp, , sizeof(dp));
  16. for (int i = ; i <= tot; i++)
  17. dp[i][] = cnt[i];
  18. for (int j = ; ( << j) <= n; j++) // 这里的长度 是 n 是整个区间内的全部元素,
  19. {
  20. for (int i = ; i + ( << j) - <= tot; i++) //
  21. {
  22. dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - )) ][j - ]);
  23. }
  24. }
  25. }
  26. int RMQ(int l, int r)
  27. {
  28. if (l > r)
  29. return ;
  30. int k = ;
  31. while ( << (k + ) <= (r - l + ))
  32. k++;
  33. return max(dp[l][k], dp[r - ( << k) + ][k]);
  34. }
  35. int main()
  36. {
  37. while (scanf("%d", &n) != EOF && n)
  38. {
  39. scanf("%d", &m);
  40. memset(num, , sizeof(num));
  41. memset(Right, , sizeof(Right));
  42. memset(Left, , sizeof(Left));
  43. memset(cnt, , sizeof(cnt));
  44. int temp, last = INF;
  45. tot = ;
  46. for (int i = ; i <= n; i++)
  47. {
  48. scanf("%d", &temp);
  49. if (temp == last) // 如果与前面的数相等
  50. {
  51. num[i] = tot; // 当前位置的段号不变
  52. Right[tot]++; //当前段的右边的位置+1,
  53. cnt[tot]++; //当前段的元素个数+1
  54. }
  55. else //如果不与前面的数相等则开启一个新的段
  56. {
  57. num[i] = ++tot; // 段号++,
  58. cnt[tot]++;
  59. Left[tot] = Right[tot] = i; // 当前段的左右端点都是i
  60. last = temp; // 记录一下当前的元素
  61. }
  62. }
  63. RMQ_init();
  64. int l, r;
  65. while (m--)
  66. {
  67. scanf("%d%d", &l, &r);
  68. if (num[l] == num[r])
  69. {
  70. printf("%d\n", r - l + );
  71. continue;
  72. }
  73. printf("%d\n", max(RMQ(num[l] + , num[r] - ), max(Right[ num[l] ] - l + , r - Left[ num[r] ] + )));
  74. }
  75. }
  76. return ;
  77. }

UVA 11235Frequent values(RMQ)的更多相关文章

  1. RMQ算法 以及UVA 11235 Frequent Values(RMQ)

    RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8)  内的最大值.数据量小 ...

  2. UVA 11235 Frequent Values ---RMQ

    大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...

  3. UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)

    题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...

  4. POJ3368Frequent values[RMQ 游程编码]

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17581   Accepted: 6346 ...

  5. poj 3368 Frequent values(RMQ)

    /************************************************************ 题目: Frequent values(poj 3368) 链接: http ...

  6. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  7. poj3368Frequent values(RMQ)

    http://poj.org/problem?id=3368 追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来..然后想RMQ 想出来了 算是离散吧 把每个数出现的次数以及开始的位置及结束的位 ...

  8. [poj3368]Frequent values(rmq)

    题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. 解题关键:统计次数,转化为RMQ问题,运用st表求解,注意边界. 预处理复杂度:$O(n\log n)$ ...

  9. POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)

    题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...

随机推荐

  1. <![CDATA[的web使用简单说明

    html.javascript会涉及到三个解析器,html解析器.xml解析器.javascript解析器.那么好了,问题来了,以上代码经常混编在一起,各自有各自的规则,终究会有冲突的,如下就是冲突. ...

  2. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

  3. Android编码规范05

    编码逻辑规范总结: 1.避免使用多个类放在一个文件里,除非是一次性使用的内部类 2.一个方法代码长度最好不要超过35行 3.原则上尽量不要修改自动生成的文件,如R文件 4.Final String 取 ...

  4. 关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友

    关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可

  5. Eclipse for Java EE软件操作集锦(二)

    看本文章之前请确保已经了解eclipse建立web工程,如果有疑问请查看本系列文章第一篇 eclipse软件操作集锦(一) 1.我们添加一个servlet 配置一下web.xml测试一下是否能正常显示 ...

  6. win7的6个网络命令

    1 名称: Ipconfig 参数: /all : 显示详细信息 /renew: 更新所有适配器 /renew EL*:更新所有名称以EL为开头的连接 /release *Con*: 释放所有匹配的连 ...

  7. MS SQL巡检系列——检查重复索引

    前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...

  8. T-SQL 实现行转列

    问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id  Value   ColumnName 1   John    FirstName 2   2 ...

  9. (转载)centos yum源的配置和使用

    原文地址:http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html 一.yum 简介 yum,是Yellow dog Updater, ...

  10. [原创]最近使用React-Native的适配问题和警告搜集

    主要记录一下最近使用RN 0.29.2版本遇到的适配的坑以及部分警告的解法. 适配类: 安卓输入框圆角.边框颜色.粗细等无法设置成功,需要在TextInput外面新增一个View设置圆角,TextIn ...