训练指南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)的更多相关文章

  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. RichText

    RichText 效果 特点 1.按照需要调节部分字体的颜色 2.调节段落的行间距,字间距 源码 github:https://github.com/makingitbest/RichText 细节 ...

  2. git+coding.net记录篇

    很久没用了,有些配置快忘记了,记录下来,以供以后参考回忆 首先下载好git插件,然后在as上面设置好本地项目地址 设置好git,点击test测试通过 然后把项目添加到git本地库 你会看到你项目里的文 ...

  3. UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning

    #import "ModelAnimationDelegate.h" #import <UIKit/UIKit.h> #import "MapVC.h&quo ...

  4. SDK接入(2)之Android Google Play内支付(in-app Billing)接入

    SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之 ...

  5. mysql操作入门基础之对数据库和表的增删改查

    一.数据库管理-- 1.登陆数据库 mysql -u root -p; -- 2.查看数据库服务器所有数据库 SHOW DATABASES; -- 3.创建数据库 CREATE DATABASE My ...

  6. git与github安装、配置、pull、push

    操作系统是Ubuntu 16.04 LTS 64bit 1 安装git (1)安装 sudo apt-get install git-core (2)一些全局变量的初始化 在本地建立一个文件夹,然后做 ...

  7. 安装Nginx服务

    Nginx最大特点: 静态小文件(1M),支持高并发,同时占用系统资源很少.3W并发,10个进程,内存150M. Nginx特点: 1.配置简单,灵活,轻量. 2.高并发(静态小文件),静态几万的并发 ...

  8. android 设颜色透明值

    如:把    <color name="line_gray_tran">#8d8d8d</color> 要设70%的透明值 计算方法:255*0.75=19 ...

  9. [转]How do you create a custom AuthorizeAttribute in ASP.NET Core?

    问: I'm trying to make a custom authorization attribute in ASP.NET Core. In previous versions it was ...

  10. plain framework 商业版 开发总结1 updated

    每天对着不同的计划,多多少少有一种无形的压力.特别是对技术不好的我来说,过程中遇到的问题实在不少,时常纠结良久.时间慢慢流逝,最后虽然感觉有些不足,但是也不至于差强人意.商业版的PF核心已经升级到1. ...