RMQ

作者: _弓长_大人 | 来源:发表于2017-01-23 15:29 被阅读13次

优化可以存log2(N),pow(2,n)可以用<< 来实现

#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 50005;
const int Q = 200005;
int str[N];
int f[N][16];
int ff[N][16];
int n, q;
int MAX(int a, int b)
{
    if (a > b)
    return a;
    return b;
}
int MIN(int a, int b)
{
    if (a < b)
        return a;
    return b;
}
int fun1(int a, int b)
{
    int nn = b - a + 1;
    int c;
    int mm = str[a];
    while (nn!=0)
    {
        c = log2(nn);//2的指数;
        nn = nn - (int)pow(2, c);//剩下的数;
        if (mm < f[a][c])
        {
            mm = f[a][c];
        }
        a = a + (int)pow(2, c);
    }
    return mm;
}
int fun2(int a, int b)
{
    int nn = b - a + 1;
    int c;
    int mm = str[a];
    while (nn != 0)
    {
        c = log2(nn);//2的指数;
        nn = nn - (int)pow(2, c);//剩下的数;
        if (mm > ff[a][c])
        {
            mm = ff[a][c];
        }
        a = a + (int)pow(2, c);
    }
    return mm;
}
int main()
{
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &str[i]);
        f[i][0] = str[i];
        ff[i][0] = str[i];
    }
        for (int j = 1; j <= log2(n); j++)
        {
            for (int i = 1; i <= n, (int)pow(2, j) + i - 1 <= n; i++)
            {
                f[i][j] = MAX(f[i][j - 1], f[i + (int)pow(2, j - 1)][j - 1]);//预处理最大值
                ff[i][j] = MIN(ff[i][j - 1], ff[i + (int)pow(2, j - 1)][j - 1]);//预处理最小值
            }
        }
        int a, b;
        for (int i = 1; i <= q; i++)
        {
            scanf("%d%d", &a, &b);
            printf("%d\n", fun1(a, b) - fun2(a, b));
        }
    return 0;
}

相关文章

  • RMQ

    优化可以存log2(N),pow(2,n)可以用<< 来实现

  • 区间---RMQ区间最值查询

    RMQ区间最值查询,对于长度为n的数组A[]。RMQ(i,j),返回数组A区间[i , j]内的最大值或最小值。 ...

  • RMQ问题

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RM...

  • RMQ—ST

    原题链接[https://www.acwing.com/problem/content/1272/] 在RMQ问题...

  • rocket mq通讯模型源码分析

    该章节主要深入分析rmq是如何构建自己的通讯模型的,主要从以下四点分析: 1、总概论述 2、rmq的通讯协议实现。...

  • Fenwick Tree/B.I.T树状数组算法

    树状数组适用范围:给定区间,求最值,求和,区间单点修改。与RMQ不同的是,RMQ一般只用作区间求最值。但在最值方面...

  • RMQ-ST表

    以前学RMQ的时候完全不懂,最近写到了类似的题,在看了几篇博客,加上以前整理的笔记,才加深了对RMQ算法的理解。R...

  • RabbitMQ学习(四)可靠性投递和confirm机制

    RMQ可靠性投递 一.什么是RMQ的可靠性投递 1.保障消息的成功发出2.保障MQ节点的成功接收3.发送端收到MQ...

  • RocketMQ与Kafka对比(18项差异)

    转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka ...

  • RabbitMQ Operator on Kubernetes

    下载Operator定义 下载rmq operator定义 - cluster-operator.yml[http...

网友评论

      本文标题:RMQ

      本文链接:https://www.haomeiwen.com/subject/rpuabttx.html