• RMQ-ST求区间最值


    二分果然是宇宙最强法则。。。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <string>
     5 #include <cstdio>
     6 #include <cmath>
     7 #define MAXN 2222222
     8 #define MAXM 11111
     9 #define lch(x) x<<1
    10 #define rch(x) x<<1|1
    11 #define lson l,m,rt<<1
    12 #define rson m+1,r,rt<<1|1
    13 using namespace std;
    14 int mi[MAXN][22], mx[MAXN][22], w[MAXN];
    15 int n, q;
    16 void rmqinit()
    17 {
    18     for(int i = 1; i <= n; i++) mi[i][0] = mx[i][0] = w[i];
    19     int m = (int)(log(n * 1.0) / log(2.0));
    20     for(int i = 1; i <= m; i++)
    21         for(int j = 1; j <= n; j++)
    22         {
    23             mx[j][i] = mx[j][i - 1];
    24             if(j + (1 << (i - 1)) <= n) mx[j][i] = max(mx[j][i], mx[j + (1 << (i - 1))][i - 1]);
    25             mi[j][i] = mi[j][i - 1];
    26             if(j + (1 << (i - 1)) <= n) mi[j][i] = min(mi[j][i], mi[j + (1 << (i - 1))][i - 1]);
    27         }
    28 }
    29 int rmqmin(int l,int r)
    30 {
    31     int m = (int)(log((r - l + 1) * 1.0) / log(2.0));
    32     return min(mi[l][m] , mi[r - (1 << m) + 1][m]);
    33 }
    34 int rmqmax(int l,int r)
    35 {
    36     int m = (int)(log((r - l + 1) * 1.0) / log(2.0));
    37     return max(mx[l][m] , mx[r - (1 << m) + 1][m]);
    38 }
    39 int main()
    40 {
    41     scanf("%d", &n);
    42     for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
    43     rmqinit();
    44     int l, r;
    45     scanf("%d",&q);
    46     while(q--)
    47     {
    48         scanf("%d%d", &l, &r);
    49         printf("%d
    ", rmqmin(l, r));
    50     }
    51     return 0;
    52 }
    代码君
  • 相关阅读:
    javaweb中静态文件的处理方法
    ThinkPHP5.0 模板函数
    ThinkPHP5.0 视图层
    ThinkPHP5.0 模型聚合操作
    ThinkPHP5.0 模型查询操作
    ThinkPHP5.0 模型删除操作
    ThinkPHP5.0 模型更新操作
    ThinkPHP5.0 模型新增操作
    ThinkPHP5.0 模型调用
    ThinkPHP5.0 数据库操作说明
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4174854.html
Copyright © 2020-2023  润新知