标签:blog http io ar os sp for 数据 div
南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。
所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。
现在,请你写一个程序,帮小工回答南将军每次的询问吧。
注意,南将军可能询问很多次。
5 2 1 2 6 9 3 1 2 2 4
1 7
/*
f[i][j]=max(f[i][j-1],f[i+1<<(j-1)][j-1])
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define maxn 100010
int n,q;
int a[maxn],maxsum[maxn][20],minsum[maxn][20];
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
maxsum[i][0]=a[i];
minsum[i][0]=a[i];
}
for(int j=1;j<20;j++)
for(int i=1;i<n;i++)
if(i+(1<<(j-1))<=n)
{
maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]);
minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]);
}
for(int i=1;i<=q;i++)
{
int m,n;
scanf("%d%d",&m,&n);
int k=(int)(log(n-m+1.0)/log(2.0));
int maxi=max(maxsum[m][k],maxsum[n-(1<<k)+1][k]);
int mini=min(minsum[m][k],minsum[n-(1<<k)+1][k]);
printf("%d\n",maxi-mini);
}
return 0;
}
运算符注意了。。。
标签:blog http io ar os sp for 数据 div
原文地址:http://www.cnblogs.com/a972290869/p/4101124.html