求助玄关
查看原帖
求助玄关
1248522
mlvx楼主2024/5/16 16:38

知道 n,mn,m 可能会超一千,但是不会开(

map 会 T,vector 貌似不行(?)

#include<bits/stdc++.h>
using namespace std;
const int N=1010,L=15;
int T,n,m,l,r,mid,lg[N],dp[N][N][L];
int query(int x,int y,int c){
	int k=lg[c];
	return min(min(dp[x][y][k],dp[x+c-(1<<k)][y][k]),min(dp[x][y+c-(1<<k)][k],dp[x+c-(1<<k)][y+c-(1<<k)][k]));
}bool check(int c){
	for(int i=1;i<=n-c+1;i++)for(int j=1;j<=m-c+1;j++)if(query(i,j,c)>=c)return 1;
	return 0;
}int main(){
	cin>>T;
	for(int i=2;i<N;i++)lg[i]=lg[i>>1]+1;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&dp[i][j][0]);
		for(int l=1;l<L;l++)for(int i=1;i+(1<<l-1)<=n;i++)for(int j=1;j+(1<<l-1)<=m;j++)dp[i][j][l]=min(min(dp[i][j][l-1],dp[i+(1<<l-1)][j][l-1]),min(dp[i][j+(1<<l-1)][l-1],dp[i+(1<<l-1)][j+(1<<l-1)][l-1]));
		for(l=0,r=min(n,m)+1;l+1<r;check(mid=l+r>>1)?l=mid:r=mid);
		cout<<l<<'\n';
	}return 0;
}
2024/5/16 16:38
加载中...