• SSLZYC 质量检测 【RMQ】


    题目大意:
    给出一个数列,求出从第m个开始imm的最小值。

    Input

    10 4
    16 5 6 9 5 13 14 20 8 12

    Output

    5
    5
    5
    5
    5
    8
    8

    思路:

    RMQ

    先套一个RMQ的模板,将该数列每一区间的最小值求出,然后从m枚举到n,每次输出该区间的最小值即可。


    代码:

    #include <cstdio>
    #include <cmath>
    using namespace std;
    
    int a[1000001][25],x,y,n,m,o;
    
    int minn(int x,int y)
    {
        if (x<y) return x; else return y;
    } 
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
         scanf("%d",&a[i][0]);
        for (int j=1;j<=20;j++)  //最多2^20
         for (int i=1;i+(1<<j-1)<=n;i++)
          a[i][j]=minn(a[i][j-1],a[i+(1<<j-1)][j-1]);  //min[l,r]=min(min[l,mid],min[mid,r]);
        for (int i=m;i<=n;i++)  //枚举
        {
            x=i-m+1;
            y=i;
            o=log2(y-x+1);  //因为第二位维数组是2^k次方,所以要用log2()求出k
            printf("%d\n",minn(a[x][o],a[y-(1<<o)+1][o]));  //输出该区间最小值
        }
        return 0;
    }
  • 相关阅读:
    2018.5.27 OraclePLSQL编程 if-else练习和循环结构练习
    桶排序
    从函数中返回引用
    函数返回值
    参数传递模式
    计数排序(不基于比较的排序算法)
    快排序
    堆用作优先队列
    堆排序
    合并算法
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313055.html
Copyright © 2020-2023  润新知