st表40分求助
查看原帖
st表40分求助
695256
qhxnjr楼主2022/3/12 10:48
#include<bits/stdc++.h>
using namespace std;
int ma[1001][1001],mi[1001][1001],n,logn;
int query(int x,int y){
	int xx=x+n,yy=y+n,k=log2(n);
	//cout<<max(max(ma[x][y],ma[xx-(1<<k)+1][yy-(1<<k)+1]),max(ma[xx-(1<<k)+1][y],ma[x][yy-(1<<k)+1]))<<" "<<min(min(mi[x][y],mi[xx-(1<<k)+1][yy-(1<<k)+1]),min(mi[xx-(1<<k)+1][y],mi[x][yy-(1<<k)+1]))<<endl;
	return max(max(ma[x][y],ma[xx-(1<<k)+1][yy-(1<<k)+1]),max(ma[xx-(1<<k)+1][y],ma[x][yy-(1<<k)+1]))-min(min(mi[x][y],mi[xx-(1<<k)+1][yy-(1<<k)+1]),min(mi[xx-(1<<k)+1][y],mi[x][yy-(1<<k)+1]));
}
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]=mi[i][j]=num;
		}
	}
	for(int k=1;(1<<k)<=n;k++){
		for(int i=1;i+(1<<k)<a;i++){
			for(int j=1;j+(1<<k)<b;j++){
				ma[i][j]=max(max(ma[i+(1<<(k-1))][j],ma[i][j+(1<<(k-1))]),max(ma[i][j],ma[i+(1<<(k-1))][j+(1<<(k-1))]));
				mi[i][j]=min(min(mi[i+(1<<(k-1))][j],mi[i][j+(1<<(k-1))]),min(mi[i][j],mi[i+(1<<(k-1))][j+(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 10:48
加载中...