• poj 3264 Balanced Lineup


    题目链接:http://poj.org/problem?id=3264

    解题思路:RMQ (Range Minimum/Maximum Query).

     1 ///////////////////////////////////////////////////////////////////////////
     2 //problem_id: poj 3264
     3 //user_id: SCNU20102200088
     4 ///////////////////////////////////////////////////////////////////////////
     5 
     6 #include <algorithm>
     7 #include <iostream>
     8 #include <iterator>
     9 #include <iomanip>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <string>
    13 #include <vector>
    14 #include <cstdio>
    15 #include <cctype>
    16 #include <cmath>
    17 #include <queue>
    18 #include <stack>
    19 #include <list>
    20 #include <set>
    21 #include <map>
    22 using namespace std;
    23 
    24 ///////////////////////////////////////////////////////////////////////////
    25 typedef long long LL;
    26 const double PI=acos(-1.0);
    27 ///////////////////////////////////////////////////////////////////////////
    28 
    29 ///////////////////////////////////////////////////////////////////////////
    30 //Add Code:
    31 //Min[i][j]表示从i开始,长度为2^j的一段元素的最小值
    32 //Max[i][j]表示从i开始,长度为2^j的一段元素的最大值
    33 int h[50005],Min[50005][20],Max[50005][20];
    34 
    35 int min(int a,int b){
    36     return a<b? a:b;
    37 }
    38 
    39 int max(int a,int b){
    40     return a>b? a:b;
    41 }
    42 
    43 void RMQ_init(int n){
    44     int i,j;
    45     for(i=1;i<=n;i++) Max[i][0]=Min[i][0]=h[i];
    46     for(j=1;(1<<j)<=n;j++){
    47         for(i=1;i+(1<<j)-1<=n;i++){
    48             //递推求Min[i][j],Max[i][j]
    49             Min[i][j]=min(Min[i][j-1],Min[i+(1<<(j-1))][j-1]);
    50             Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);
    51         }
    52     }
    53 }
    54 
    55 int RMQ(int L,int R){
    56     int k=0;
    57     while((1<<(k+1))<=R-L+1) k++;  //求满足2^k<=R-L+1的最大的k
    58     return max(Max[L][k],Max[R-(1<<k)+1][k])-min(Min[L][k],Min[R-(1<<k)+1][k]);
    59 }
    60 ///////////////////////////////////////////////////////////////////////////
    61 
    62 int main(){
    63     ///////////////////////////////////////////////////////////////////////
    64     //Add code:
    65     int n,q,a,b,i;
    66     scanf("%d%d",&n,&q);
    67     for(i=1;i<=n;i++) scanf("%d",&h[i]);
    68     RMQ_init(n);
    69     while(q--){
    70         scanf("%d%d",&a,&b);
    71         printf("%d
    ",RMQ(a,b));
    72     }
    73     ///////////////////////////////////////////////////////////////////////
    74     return 0;
    75 }
    76 
    77 ///////////////////////////////////////////////////////////////////////////
    78 /*
    79 Testcase:
    80 Input:
    81 6 3
    82 1
    83 7
    84 3
    85 4
    86 2
    87 5
    88 1 5
    89 4 6
    90 2 2
    91 Output:
    92 6
    93 3
    94 0
    95 */
    96 ///////////////////////////////////////////////////////////////////////////
  • 相关阅读:
    测试方法与步骤
    团队项目需求分析
    第一次个人作业
    3种shell自动交互的方法
    mysql用户管理
    build web application with golang
    安卓中的LINUX内核
    结对项目小结
    关于aria2-yaaw下载软件
    软工结对项目预览
  • 原文地址:https://www.cnblogs.com/linqiuwei/p/3261333.html
Copyright © 2020-2023  润新知