首页 > 其他 > 详细

A - Balanced Lineup

时间:2021-07-22 11:07:32      阅读:21      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

 

题目网址:3264 -- Balanced Lineup (poj.org)

思路:

对于输入的区间求出其中的最大值最小值的差值;

首先拥有RMQ算法初始化把区间最大值都运算出来;

然后在对每个输入的区间进行z值计算,在算出结果输出;

代码实现:

#include <iostream>
#include <algorithm>
using namespace std;
int maxn[50010][20];
int minn[50010][20];
int main()
{
    int t,n,q,x,y;
    cin>>n>>q;
    for(int c1=1;c1<=n;c1++)
    {
        cin>>t;//输入初始化在从c1开始长度为1的区间最大值最小值都为自己
        maxn[c1][0]=t;
        minn[c1][0]=t;
    }
    for(int c1=1;(1<<c1)<=n;c1++)//进行打表计算
        for(int c2=1;(c2+(1<<c1)-1)<=n;c2++)
        {
            maxn[c2][c1]=max(maxn[c2][c1-1],maxn[c2+(1<<(c1-1))][c1-1]);
//2?c1的区间的最值为前2?c1-1区间的最值与后2?c1-1区间最值的最值 minn[c2][c1]
=min(minn[c2][c1-1],minn[c2+(1<<(c1-1))][c1-1]); } while(q--) { cin>>x>>y; int z=0; while(1<<(z+1)<=y-x+1)z++;
//计算区间长度于2?z的关系
int ans=max(maxn[x][z],maxn[y-(1<<z)+1][z])-min(minn[x][z],minn[y-(1<<z)+1][z]); cout<<ans<<endl; } return 0; }

A - Balanced Lineup

原文:https://www.cnblogs.com/wangdy/p/15042642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!