POJ 3368/RMQ

原创 2016年08月29日 21:05:47

题目链接

/*
给出一段序列,询问[L,R]区间内最大相同数的个数。
用一个很巧妙地方法,转化成求区间内的最大值的问题。
RMQ维护区间最大值。
MAX处理:
*/
    for(int i=1;i<n;i++)
        {
            if(a[i]==a[i-1])
                d[i]=d[i-1]+1;
            else
                d[i]=1;
        }
/*
给出一个序列,1、1、1、1、2、3、4、5.
长度为8,求[2,8];即{1、1、1、2、3、4、5},暴力求出3,(前三个数相同),然后RMQ[5,8],取两者最大值。
£:说一来麻烦,举个栗子。
*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long  LL;
const int maxn =100000+5;
int a[maxn];
int d[maxn];
int dp[maxn][20];
int n,q;
int l,r;
int RMQ(int l,int r)
{
    int k=log((double)(r-l+1))/log(2.0);//学长的写法,可以的。
    return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main ()
{
    while(scanf("%d",&n),n)
    {
        scanf("%d",&q);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        d[0]=1;
        for(int i=1;i<n;i++)
        {
            if(a[i]==a[i-1])
                d[i]=d[i-1]+1;
            else
                d[i]=1;
        }
        for(int i=0;i<n;i++)
            dp[i][0]=d[i];
        for(int k=1;(1<<k)<=n;k++)
            for(int i=0;i+(1<<k)-1<n;i++)
                dp[i][k]=max(dp[i][k-1],dp[i+(1<<(k-1))][k-1]);
        for(int i=0;i<q;i++)
        {
            scanf("%d%d",&l,&r);
            l--;
            r--;
            if(l>r)
                continue;
            if(l==r)
                printf("1\n");
            else
            {
                int t=l;
                while(t<r&&a[t]==a[t+1])t++;
                int ans=t-l+1;
                if(t==r||t+1==r)
                    printf("%d\n",ans);
                else
                {
                    printf("%d\n",max(ans,RMQ(t+1,r)));
                }
            }
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 3368(RMQ简单应用)

Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13317 ...
  • my_acm
  • my_acm
  • 2014年08月18日 09:11
  • 591

最近公共祖先(LCA)算法实现过程 【Tarjan离线+倍增在线+RMQ】

最近公共祖先(LCA) 首先来介绍下最近公共祖先(LCA)的概念 百度上的解释:对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度...
  • my_sunshine26
  • my_sunshine26
  • 2017年05月24日 22:31
  • 1188

poj3368(线段树)

http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total ...
  • lanjiangzhou
  • lanjiangzhou
  • 2013年05月30日 11:05
  • 1984

poj之旅——3368

//好一段时间没弄了,期末考试去了,手都生了。 题目描述: 给出n个非递减序列数,有Q个询问,l,r表示从l到r的出现次数最多的数的出现次数。 题解: 可以为了省空间而浪费编程...
  • no1_terminator
  • no1_terminator
  • 2016年07月02日 13:59
  • 78

poj 3368 统计区间出现次数最多数个数 RMQ

对上升序列如:1 1 2 2 2 3 3 4 5 5 ....... 统计区间出现次数最多数个数。 我们可以构造一个b[]数组, if(a[i]==a[i-1])b[i]=b[i-1]+1; e...
  • Mtrix
  • Mtrix
  • 2016年09月16日 14:08
  • 787

poj 3368 RMQ 求最多出现次数的数

题意: 给定一个非降序序列,给出查询i,j,求出区间[i,j]中出现次数最多的数的出现次数 解法: 1.编码   把连续的数值编码为例如(1,3),数值1出现了3次 2.设计区段 把原始的...
  • cfzjxz
  • cfzjxz
  • 2013年04月10日 10:57
  • 1554

POJ 3368 区间最值

题目Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15658 Accepted: 57...
  • qq_22902423
  • qq_22902423
  • 2016年02月15日 13:31
  • 118

POJ 3368 线段树

思路: 先统计在第i个位置当前数字已经出现的次数。 维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置 查找的时候分为两种情况: 没有和边界相交(意会意...
  • qq_31785871
  • qq_31785871
  • 2016年08月06日 17:53
  • 103

RMQ(模板 ST 区间最值,区间频繁次数)

RMQ(模板 ST 区间最值,区间频繁次数)
  • u012860063
  • u012860063
  • 2014年11月03日 22:36
  • 1494

关于RMQ问题的一些感悟

根据询问,修改,单点,区间,在线,离线的各种组合大概有8类问题吧。 一般就是4种解决办法吧。 1、线段树 2、树状数组 3、ST表 4、差分 线段树的话是最万能的方法了...
  • xl2015190026
  • xl2015190026
  • 2017年03月07日 15:57
  • 501
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3368/RMQ
举报原因:
原因补充:

(最多只允许输入30个字)