RMQ

优化可以存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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 介绍 从一个有根树中寻找一对节点的最小公共祖先(Lowest common ancestor)的问题,从20世纪就...
    HITMiner阅读 5,514评论 0 2
  • 题目大意:给出一串数字,然后给出一个区间a b,输出从a到b的最大的数和最小的数的差。 N(1 ≤ N ≤ 500...
    sugar_coated阅读 4,531评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,856评论 25 709
  • 我住在城南 你住在城北 城北很近 城南很远
    东叁日初阅读 994评论 0 0
  • 我们很多高管总是在抱怨,这个人能力不行,那个人工作态度有问题。在我看来,很多员工的表现不好,业绩不高,最终的问题可...
    文佳newway阅读 3,599评论 5 5