2 条题解
-
1
二维st表秒了,这题纯送
#include<iostream> #include<cstdio> #include<cmath> using namespace std; bool Test_MLE_start; constexpr int N=1005; int _=1,n,m,k,ans=2e9,a[N][N],maxn[N][N][15],minn[N][N][15]; inline int reads(){ char c=getchar(); int x=0,f=1; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^'0');c=getchar();} return x*f; } inline void files(){ freopen("square.in","r",stdin); freopen("square.out","w",stdout); } inline void clr(){ // Don't forget! } int asksmaxn(int x1,int y1,int x2,int y2){ int k=log(x2-x1+1)/log(2); return max(max(maxn[x1][y1][k],maxn[x2-(1<<k)+1][y1][k]),max(maxn[x1][y2-(1<<k)+1][k],maxn[x2-(1<<k)+1][y2-(1<<k)+1][k])); }int asksminn(int x1,int y1,int x2,int y2){ int k=log(x2-x1+1)/log(2); return min(min(minn[x1][y1][k],minn[x2-(1<<k)+1][y1][k]),min(minn[x1][y2-(1<<k)+1][k],minn[x2-(1<<k)+1][y2-(1<<k)+1][k])); } bool Test_MLE_end; signed main(){ // printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0); // files(); // _=reads(); while(_--){ clr();n=reads(),m=reads(),k=reads(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) minn[i][j][0]=maxn[i][j][0]=a[i][j]=reads(); }for(int k=1;k<=14;k++){ for(int i=1;i+(1<<k)-1<=n;i++){ for(int j=1;j+(1<<k)-1<=m;j++){ maxn[i][j][k]=max(max(maxn[i][j][k-1],maxn[i][j+(1<<(k-1))][k-1]),max(maxn[i+(1<<(k-1))][j][k-1],maxn[i+(1<<(k-1))][j+(1<<(k-1))][k-1])); minn[i][j][k]=min(min(minn[i][j][k-1],minn[i][j+(1<<(k-1))][k-1]),min(minn[i+(1<<(k-1))][j][k-1],minn[i+(1<<(k-1))][j+(1<<(k-1))][k-1])); } } }for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(i+k-1>n||j+k-1>m) continue; int x1=i,y1=j,x2=i+k-1,y2=j+k-1; ans=min(asksmaxn(x1,y1,x2,y2)-asksminn(x1,y1,x2,y2),ans); } }printf("%d\n",ans); } return 0; } /* 5 4 2 1 2 5 6 0 17 16 0 16 17 2 1 2 10 2 1 1 2 2 2 */
信息
- ID
- 523
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 4
- 已通过
- 3
- 上传者