五十分,不知何错,H E L P . . . .
查看原帖
五十分,不知何错,H E L P . . . .
339568
TonviaSzt楼主2021/3/20 17:38

自用RMQ,状态转移方程如下:

ma[i][j]=max(ma[i][j-1],ma[i+(1<<j)][j-1]);

mi[i][j]=min(mi[i][j-1],mi[i+(1<<j)][j-1]);

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
int n,q,r1[50005][20],r2[50005][20];
int getAns(int l,int r){
	int x=(int)(log2(r-l+1));
	return max(r1[l][x],r1[r-(1<<x)+1][x])-min(r2[l][x],r2[r-(1<<x)+1][x]);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n;i++) r2[i][j]=1e8;
	for(int i=1;i<=n;i++) scanf("%d",&r1[i][0]),r2[i][0]=r1[i][0];
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i<=n;i++)
			r1[i][j]=max(r1[i][j-1],r1[i+(1<<(j-1))][j-1]);
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i<=n;i++)
			r2[i][j]=min(r2[i][j-1],r2[i+(1<<(j-1))][j-1]);
	while (q--){
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",getAns(l,r));
	}
	return 0;
}
2021/3/20 17:38
加载中...