POJ 3264 Balanced Lineup(RMQ)

来源:互联网 发布:淘宝卖玩具利润怎么样 编辑:程序博客网 时间:2024/06/07 07:07

题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27676#problem/A

代码:

#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>const int maxn=50000+5;int dmaxn[maxn][20];int dminn[maxn][20];using namespace std;void RMQ_init(const vector<int>& A){    int n=A.size();    for(int i=0;i<n;i++)dmaxn[i][0]=A[i];    for(int j=1;(1<<j)<=n;j++)    {        for(int i=0;i+(1<<j)-1<n;i++)        {            dmaxn[i][j]=max(dmaxn[i][j-1],dmaxn[i+(1<<(j-1))][j-1]);        }    }    n=A.size();    for(int i=0;i<n;i++)dminn[i][0]=A[i];    for(int j=1;(1<<j)<=n;j++)    {        for(int i=0;i+(1<<j)-1<n;i++)        {            dminn[i][j]=min(dminn[i][j-1],dminn[i+(1<<(j-1))][j-1]);        }    }}int RMQ(int L,int R){    int k=0;    while(1<<(k+1)<=R-L+1) k++;    return max(dmaxn[L][k],dmaxn[R-(1<<k)+1][k])-min(dminn[L][k],dminn[R-(1<<k)+1][k]);}int main(){    int n,q;    scanf("%d%d",&n,&q);    vector<int>k;    for(int i=0;i<n;i++)    {        int x;        scanf("%d",&x);        k.push_back(x);    }    RMQ_init(k);    for(int i=0;i<q;i++)    {        int x,y;        scanf("%d%d",&x,&y);        printf("%d\n",RMQ(x-1,y-1));    }}

0 0
原创粉丝点击