题目链接:https://vjudge.net/problem/UVA-11235

题意:给一串不递减数字,q次询问,每次查询[l,r]内出现次数最多的数字出现的次数。

查询分两部分:一部分是[l,r]为同一个数的区间,另一部分则是在上下界处截取一部分的情况。

首先离散化,后用l[],r[],v[]分别记录每一段相同数字的左右区间和出现次数。v可以直接由r-l+1更新得到。

第一部分更新ret后,接下来的rmq分三部分:

第一部分查询左边界截取一部分的数字的当前长度,第二部分查询右边界的,第三部分查询删掉左右边界后中间完整的部分的最值。

ST表维护最值就好了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 100100;
 6
 7 int n, m, q;
 8 int a[maxn];
 9 int h[maxn], hcnt;
10
11 int l[maxn], r[maxn], v[maxn];
12 int dp[maxn][33];
13
14 void st(int* b) {
15     for(int i = 1; i <= m; i++) dp[i][0] = b[i];
16     int k = int(log(n+1.0)/log(2.0));
17     for(int j = 1; j <= k; j++) {
18         for(int i = 1; i + (1 << j) - 1 <= m; i++) {
19             dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
20         }
21     }
22 }
23
24 int query(int l, int r) {
25     int k = int(log(r-l+1.0)/log(2.0));
26     return max(dp[l][k], dp[r-(1<<k)+1][k]);
27 }
28
29 int id(int x) {
30     return lower_bound(h, h+hcnt, x) - h + 1;
31 }
32
33 int main() {
34     // freopen("in", "r", stdin);
35     while(~scanf("%d",&n) && n) {
36         scanf("%d", &q);
37         memset(l, 0, sizeof(l));
38         memset(r, 0, sizeof(r));
39         memset(v, 0, sizeof(v));
40         m = -1;
41         int pre = -1, ll = 1, rr, cnt = 0;
42         for(int i = 1; i <= n; i++) {
43             scanf("%d", &a[i]);
44             h[i-1] = a[i];
45         }
46         sort(h, h+n); hcnt = unique(h, h+n) - h;
47         for(int i = 1; i <= n; i++) a[i] = id(a[i]);
48         for(int i = 1; i <= n; i++) {
49             if(pre != a[i]) {
50                 l[++m] = ll, r[m] = i - 1;
51                 v[m] = r[m] - l[m] + 1;
52                 pre = a[i];
53                 ll = i;
54                 cnt = 1;
55             }
56             else rr++, cnt++;
57         }
58         l[++m] = ll, r[m] = n;
59         v[m] = r[m] - l[m] + 1;
60         st(v);
61         while(q--) {
62             scanf("%d %d", &ll, &rr);
63             if(a[ll] == a[rr]) {
64                 cout << rr - ll + 1 << endl;
65                 continue;
66             }
67             int ret = max(0, r[a[ll]]-ll+1);
68             ret = max(ret, rr-l[a[rr]]+1);
69             if(a[ll] + 1 <= a[rr] - 1) ret = max(ret, query(a[ll]+1, a[rr]-1));
70             cout << ret << endl;
71         }
72     }
73     return 0;
74 }

转载于:https://www.cnblogs.com/kirai/p/6786282.html

[uva11235]Frequent values(RMQ,ST,离散化)相关推荐

  1. POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】

    传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  2. POJ 3368 Frequent values (RMQ)

    题目链接:http://poj.org/problem?id=3368 题目大意: 给出一个n个数长度的串. m个询问 求出给定范围内的最大连续字符串的长度 方法: RMQ模板, 记录每一个位置的数连 ...

  3. poj 3368 Frequent values rmq

    题意:给你一串数列,然后给你一个起终位置对,问你这个段序列里出现最多的出现了几次. 思路:一段序列里,无非就是三种情况,1,一组相同的数,2两组相同,3,3组或者更多组数,这样我们队每一组数的开头结束 ...

  4. UVA11235 - Frequent values(游程编码+线段树)

    题目链接: https://vjudge.net/problem/UVA-11235 题目大意: 给定一个递增序列,询问一段区间内出现频率最多的数出现的次数. 解题过程: 之前图灵杯比赛的题,当时照着 ...

  5. UVA 11235 Frequent values(RMQ)

    Frequent values TimeLimit:3000Ms You are given a sequence of n integers a1 , a2 , ... , an in non-de ...

  6. 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)

    FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意: 有一个单调不降序列,让你求出某些区间内的出现次数最多的数出现的次数(有多组数据,以0结尾) ...

  7. Frequent values【线段树】

    Frequent values UVA - 11235 题目传送门 题目大意:给出一个非降序的整数数组a1,a2,a3...an,你的任务是对一系列的询问(i,j),回答ai,ai+1,ai+2... ...

  8. 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

    目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...

  9. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  10. RMQ ST算法简介

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

最新文章

  1. EXCEL公式、函数、图表应用技巧800问
  2. 支持字母数字下划线和中文的正则
  3. MongoDB 文档的更新操作
  4. 九、装配bean--通过properties文件注入值
  5. 2DToolkit官方文档中文版打地鼠教程(一):初始设置
  6. LeetCode之旋转数组
  7. Javascript String对象
  8. 如何禁止文本框输入,但是要传值
  9. python网络蜘蛛
  10. matlab与数学模型相结合例题,数学知识、数学建模、现代数学软件关系 与结合...
  11. 高通QFIL烧录错误解决方法
  12. 手机b站封面提取网站_手机b站封面自定义图片大全及获取bilibili视频封面提取网站网址...
  13. Word前几页是罗马数字,后面是阿拉伯数字怎么设置
  14. 晶圆划片如何提高切割品质?陆芯半导体告诉你
  15. 二元函数最大最小值定理证明_Von Neumann最小最大值定理的归纳法证明
  16. android端使用百度地图
  17. TDMA噪音产生机制及抑制
  18. java文字版格斗游戏。
  19. 【快速上手教程1】开源编队无人机-开机测试
  20. GBase 8c 权限说明

热门文章

  1. phpstud使用教程_phpStudy2017使用教程,自定义php版本功能上线!
  2. java 快速排序_面试必不可少的几大排序算法,你掌握了吗?
  3. php redis ip查找,PHP实现redis限制单ip、单用户的访问次数功能示例
  4. redis数据类型之sorted set
  5. django的 信号
  6. Node.js 4.0 中的 ES 6 特性介绍
  7. Dev Express 安装
  8. 从“如何设计用户超过1亿的应用”说起----数据库调优实战
  9. Visual Entity 使用(四)添加、删除属性
  10. 日常笔记(持续更新)