zoukankan      html  css  js  c++  java
  • 【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值

    【题目链接:NYOJ-119

      思路:转自 点我 ,讲的挺好。

     1 #include <cstdio>
     2 #include <math.h>
     3 #define max(a,b) ((a>b)?a:b)
     4 #define min(a,b) (a<b?a:b)
     5 const int maxn=100010;
     6 int h[maxn];
     7 int mx[maxn][20],mn[maxn][20];
     8 int n,q;
     9 void rmq_init(){
    10     int i,j,t;
    11     for(j=1;j<=n;j++) mx[j][0]=mn[j][0]=h[j];
    12     int m=floor(log((double)n)/log(2.0));
    13     for(i=1;i<=m;i++){
    14         for(j=1;j<=n;j++){
    15             t = j+(1<<(i-1));
    16             if(t<=n) mx[j][i]=max(mx[j][i-1],mx[t][i-1]);
    17             else mx[j][i]=mx[j][i-1];
    18         }
    19     }
    20     for(i=1;i<=m;i++){
    21         for(j=1;j<=n;j++){
    22             t = j+(1<<(i-1));
    23             if(t<=n) mn[j][i]=min(mn[j][i-1],mn[t][i-1]);
    24             else mn[j][i]=mn[j][i-1];
    25         }
    26     }
    27 }
    28 int rmq(int l,int r){
    29     int m=floor(log((double)(r-l+1))/log(2.0));
    30     int a=max(mx[l][m],mx[r-(1<<m)+1][m]);
    31     int b=min(mn[l][m],mn[r-(1<<m)+1][m]);    
    32     return a-b;
    33 }
    34 int main(){
    35     int i,l,r;
    36     int T,C,L,R;
    37     scanf("%d%d",&n,&q);
    38     for(i = 1;i <= n;i++)
    39         scanf("%d",&h[i]);
    40     rmq_init();
    41     while(q--){        
    42         scanf("%d%d",&L,&R);
    43         printf("%d
    ",rmq(L,R));
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    flask-离线脚本、with在上下文的应用
    websocket原理及实时投票
    微信消息的推送
    Django + Uwsgi + Nginx 的生产环境部署2
    UVA 11853 Paintball
    UVA 12171 Sculpture
    UVA 10305 Ordering Tasks
    UVA 816 Abbott's Revenge
    UVA 699 The Falling Leaves
    UVA 12657 Boxes in a Line
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4483601.html
Copyright © 2011-2022 走看看