st表50分求助(给关注)
查看原帖
st表50分求助(给关注)
695256
qhxnjr楼主2022/3/12 11:51
#include<bits/stdc++.h>
using namespace std;
int ma[1001][1001][8],mi[1001][1001][8],n,logn;
int query(int x,int y){
	int xx=x+n,yy=y+n,k=log2(n);
	//cout<<max(max(ma[x][y][k],ma[xx-(1<<k)+1][yy-(1<<k)+1][k]),max(ma[xx-(1<<k)+1][y][k],ma[x][yy-(1<<k)+1][k]))<<" "<<min(min(mi[x][y][k],mi[xx-(1<<k)+1][yy-(1<<k)+1][k]),min(mi[xx-(1<<k)+1][y][k],mi[x][yy-(1<<k)+1][k]))<<endl;
	return max(max(ma[x][y][k],ma[xx-(1<<k)+1][yy-(1<<k)+1][k]),max(ma[xx-(1<<k)+1][y][k],ma[x][yy-(1<<k)+1][k]))-min(min(mi[x][y][k],mi[xx-(1<<k)+1][yy-(1<<k)+1][k]),min(mi[xx-(1<<k)+1][y][k],mi[x][yy-(1<<k)+1][k]));
}
int main(){
	int a,b,num,ans=2147483647;cin>>a>>b>>n;
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			scanf("%d",&num);ma[i][j][0]=mi[i][j][0]=num;
		}
	}
	for(int k=1;(1<<k)<=n;k++){
		for(int i=1;i+(1<<k)-1<=a;i++){
			for(int j=1;j+(1<<k)-1<=b;j++){
				ma[i][j][k]=max(max(ma[i+(1<<(k-1))][j][k-1],ma[i][j+(1<<(k-1))][k-1]),max(ma[i][j][k-1],ma[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
				mi[i][j][k]=min(min(mi[i+(1<<(k-1))][j][k-1],mi[i][j+(1<<(k-1))][k-1]),min(mi[i][j][k-1],mi[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
			}
		}
	}
	for(int i=1;i+n-1<=a;i++){
		for(int j=1;j+n-1<=b;j++){
			ans=min(ans,query(i,j));
			//cout<<query(i,j)<<endl;
		}
	}cout<<ans;
	return 0;
}
2022/3/12 11:51
加载中...