zoukankan      html  css  js  c++  java
  • poj3264--Balanced Lineup--ST表

    Description

    有n头牛排成一个数列,给q个询问,每个询问给定l和r,求[l,r]区间内最高的牛和最低的牛的身高差。

    Sample Input

    6 3
    1
    7
    3
    4
    2
    5
    1 5
    4 6
    2 2

    Sample Output

    6

    3

    0

    题解:

      下午依然很水……

      RMQ问题,这次用st表来解决,直接上板子就好,最大最小各求一下,相减即得。

     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<cstdio>
     5 using namespace std;
     6 const int maxn=50009;
     7 int st_max[maxn][20],st_min[maxn][20];
     8 int n,q,a[maxn],l,r;
     9 void init_st()
    10 {
    11     for(int i=n;i>=1;i--)
    12     {
    13         st_max[i][0]=a[i];
    14         st_min[i][0]=a[i];
    15         for(int j=1;(i+(1<<j)-1)<=n;j++)
    16         {
    17             st_max[i][j]=max(st_max[i][j-1],st_max[i+(1<<j-1)][j-1]);
    18             st_min[i][j]=min(st_min[i][j-1],st_min[i+(1<<j-1)][j-1]);
    19         }
    20     }
    21 }
    22 int ask_max(int l,int r)
    23 {
    24     int k=(int)(log(r-l+1.0)/log(2.0));
    25     return max(st_max[l][k],st_max[r-(1<<k)+1][k]);
    26 }
    27 int ask_min(int l,int r)
    28 {
    29     int k=(int)(log(r-l+1.0)/log(2.0));
    30     return min(st_min[l][k],st_min[r-(1<<k)+1][k]);
    31 }
    32 int main()
    33 {
    34     while(scanf("%d%d",&n,&q)!=EOF)
    35     {
    36         for(int i=1;i<=n;i++)
    37         scanf("%d",&a[i]);
    38         init_st();
    39         for(int i=1;i<=q;i++)
    40         {
    41             scanf("%d%d",&l,&r);
    42             int ans=ask_max(l,r)-ask_min(l,r);
    43             printf("%d
    ",ans);
    44         }
    45     }
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    bzoj2004(矩阵快速幂,状压DP)
    bzoj1242(弦图判定)
    uva1659(最大费用循环流)
    bzoj1009
    bzoj2893(费用流)
    bzoj4873(最大权闭合子图)
    bzoj2879(动态加边费用流)
    51nod 1239 欧拉筛模板
    poj2774 sa模版
    洛谷3391文艺平衡树
  • 原文地址:https://www.cnblogs.com/Beckinsale/p/7464191.html
Copyright © 2011-2022 走看看