• SSLZYC POJ 3264 平衡的阵容


    题目大意:
    求l~r之间最大值减最小值。


    思路:

    RMQ

    模板的RMQ。
    求一遍最大值,再求一遍最小值,输出两者的差即可。


    代码:

    #include <cstdio>
    #include <cmath>
    using namespace std;
    
    int a[100001][51],b[100001][51],x,y,n,m,o;
    
    int maxxx(int x,int y){  
        if (x>y) return x;else return y;
    } 
    
    int minxx(int x,int y){
        if (x>y) return y;else return x;
    }
    
    int main(){
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&a[i][0]);
            b[i][0]=a[i][0];  //a求最大值,b求最小值
        } 
        for (int j=1;j<=30;j++)  //初始化
         for (int i=1;i+(1<<j-1)<=n;i++)
         {
            a[i][j]=maxxx(a[i][j-1],a[i+(1<<j-1)][j-1]);
            b[i][j]=minxx(b[i][j-1],b[i+(1<<j-1)][j-1]);  //求出每个区间的最大最小值
         } 
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            o=log2(y-x+1);  //即 log(y-x+1)/log(2);
            printf("%d\n",maxxx(a[x][o],a[y-(1<<o)+1][o])-minxx(b[x][o],b[y-(1<<o)+1][o]));  //输出答案
        }
        return 0;
    }
  • 相关阅读:
    一分钟应对勒索病毒WannaCry
    你不知道网络安全有多严峻
    MongoDB 文章目录
    SQL Server 文章目录
    MySQL 文章目录
    领域驱动(DD)目录
    Oracle基本教程
    系统架构研究目录
    设计原则目录
    开源项目学习历程
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313060.html
Copyright © 2020-2023  润新知