现在的位置: 首页 > 综合 > 正文

[Poj3264][Bzoj1699]Balanced Lineup

2018年01月13日 ⁄ 综合 ⁄ 共 751字 ⁄ 字号 评论关闭

Poj中log必须用double

#include<iostream>
#include<cstdio>
#include<cmath>
//#define log(a) (int)log((double)a)
using namespace std;
int mx[50001][16],mn[50001][16],n,q;
void pre(){
	for(int i=1;i<=n;i++){
		int t;scanf("%d",&t);
		mx[i][0]=mn[i][0]=t;
	}
	int t=int(floor(log(double(n))/log(2.0)));
	for(int i=1;i<=t;i++)
		for(int j=n;j>0;j--){
			mx[j][i]=mx[j][i-1];
			if(j+(1<<(i-1))<=n)mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
			mn[j][i]=mn[j][i-1];
			if(j+(1<<(i-1))<=n)mn[j][i]=min(mn[j][i],mn[j+(1<<(i-1))][i-1]);			
		}
}
int rmq(int a,int b){
	int Min,Max,t=int(floor(log(double(b-a+1))/log(2.0)));
	Max=max(mx[a][t],mx[b-(1<<t)+1][t]);
	Min=min(mn[a][t],mn[b-(1<<t)+1][t]);
	return Max-Min;
}
int main(){
	scanf("%d%d",&n,&q);pre();
	for(int i=1;i<=q;i++){
		int a,b;scanf("%d%d",&a,&b);
		printf("%d\n",rmq(a,b));
	}
	return 0;
}

抱歉!评论已关闭.