RMQ模板

附上一个详细的大佬的讲解  http://blog.csdn.net/niushuai666/article/details/6624672

RMQ模板(NYOJ 119)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN=1e5+10;
int a[MAXN];
int maxsum[MAXN][20];
int minsum[MAXN][20];
int maxx;
int minn;
void RMQ_In(int num) //预处理->O(nlogn)
{
    for(int j = 1; j < 20; ++j)
        for(int i = 1; i <= num; ++i)
            if(i + (1 << j) - 1 <= num)
            {
                maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
                minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);
            }
}
void RMQ_Query(int src,int des)
{
        int k=(int)(log(des-src+1.0)/log(2.0));
        maxx=max(maxsum[src][k],maxsum[des-(1<<k)+1][k]);
        minn=min(minsum[src][k],minsum[des-(1<<k)+1][k]);
}
int main()
{
   int n,q,a,b;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&minsum[i][0]);
        maxsum[i][0]=minsum[i][0];
    }
    RMQ_In(n);
    while(q--)
    {
        scanf("%d%d",&a,&b);
        RMQ_Query(a,b);
        printf("%d\n",maxx-minn);
    }
    return 0;
}
时间: 2024-12-21 01:30:57

RMQ模板的相关文章

POJ 3264:Balanced Lineup(RMQ模板题)

http://poj.org/problem?id=3264 题意:给出n个数,还有q个询问,询问[l,r]区间里面最大值和最小值的差值. 思路:RMQ模板题,开两个数组维护最大值和最小值就行. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 #define N 50010 7 #define

POJ 3264:Balanced Lineup Rmq模板

Balanced Lineup 题目链接: http://poj.org/problem?id=3264 题意: 求区间最大值和最小值的差 题解: Rmq模板题 代码 #include<stdio.h> #include<math.h> const int N=5e4+1; int dpmax[N][17]; int dpmin[N][17]; int mmax(int x,int y) { return x>y?x:y; } int mmin(int x,int y) {

RMQ 模板一份

 1 void RMQ_Init(const vector<int>& A) 2 { 3     int n=A.size(); 4     for (int i=0;i<n;i++) d[i][0]=A[i]; 5     for (int j=1;(1<<j)<=n;j++) 6         for (int i=0;i+(1<<j)-1<n;i++) 7             d[i][j]=min(d[i][j-1],d[i+(1

静态RMQ模板题 contest 静态RMQ T2

Description Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了.机器人们都想知道谁是最敏捷的,于是它们进行了如下一个比赛.首先,他们面前会有一排共n个数,它们比赛看谁能最先把每连续k个数中最大和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快.但是Wind也想知道答案,你能帮助他吗? Input 每组测试数据,第1行为n,k,第2行共n个数,为数字序列,所有数字均在longint范围内. Output 共n-k+1行 第i行为第i-i+k-1

LCA上的RMQ模板算法

How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10764    Accepted Submission(s): 3923 Problem Description There are n houses in the village and some bidirectional roads connecting

RMQ 模板题 poj 3264

题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=50005; int minm,maxm; int dp_max[max_][20],dp_min[ma

RMQ 模板 2012-09-13

Program Stone; var i,j,k,l,n,m,xmi,big,sma:longint; h:array[1..50000]of longint; tf:array[0..16]of longint; max,min:array[1..50000,0..16]of longint; function wmax(a,b:longint):longint; begin if a>b then wmax:=a else wmax:=b; end; function wmin(a,b:lo

RMQ(模板)

void RMQ_max_init( int n ) { memset(dp, 0x00, sizeof(dp)); for(int i = 1; i <= n; i++) dp[i][0] = a[i]; for(int j = 1; (1<<j) <= n; j++) for(int i = 1; i+(1<<j)-1 <= n; i++) dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1] ); }

算法分类整理+模板③:RMQ

最开始是打算以LCA作为第三篇算法整理的,但是由于学习LCA时发现自己的RMQ学习的不够扎实,所以先复习一下RMQ.本文感谢队友某淞的学习笔记. 最初看到RMQ模板的时候感觉好高端,感觉里面的各种数组,位移运算非常复杂.所以对于任何算法的学习我觉得都要分为以下的几步进行: 1.了解这种算法能解决什么类的问题.2.知道这种算法的最坏时间复杂度和期望时间复杂度,今后看到题的时候能通过数据范围去快速去判定某些题的解法.3.了解算法的思想和最核心的代码.4.最后就是用由浅入深的题目进行训练,直到完全掌握