求路过的好心人看一下,感觉都对,但只有三十分
查看原帖
求路过的好心人看一下,感觉都对,但只有三十分
1088782
Lycdeer楼主2024/7/26 22:31
#include<bits/stdc++.h>
using namespace std;
long long g[1005][1005];
long long maxn[1005][1005],minn[1005][1005],maxm[1005][1005],minm[1005][1005],ans=10000000000000;
deque<long long> dq;
int main(){
	int a,b,n; scanf("%d%d%d",&a,&b,&n);
	for(int i=1;i<=a;i++)
		for(int j=1;j<=b;j++) scanf("%lld",&g[i][j]);
	for(int i=1;i<=a;i++){
		dq.push_back(1);
		for(int j=2;j<=b;j++){
			while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
			while(!dq.empty()&&g[i][dq.back()]<=g[i][j]) dq.pop_back();
			dq.push_back(j);
			if(j>=n) maxn[i][j-n+1]=g[i][dq.front()];	
		}
		while(!dq.empty()) dq.pop_front();
	}
	for(int i=1;i<=b-n+1;i++){
		dq.push_back(1);
		for(int j=2;j<=a;j++){
			while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
			while(!dq.empty()&&maxn[dq.front()][i]<=maxn[j][i]) dq.pop_back();
			dq.push_back(j);
			if(j>=n) maxm[j-n+1][i]=maxn[dq.front()][i];
		}
		while(!dq.empty()) dq.pop_front();
	}
	for(int i=1;i<=a;i++){
		dq.push_back(1);
		for(int j=2;j<=b;j++){
			while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
			while(!dq.empty()&&g[i][dq.back()]>=g[i][j]) dq.pop_back();
			dq.push_back(j);
			if(j>=n) minn[i][j-n+1]=g[i][dq.front()];	
		}
		while(!dq.empty()) dq.pop_front();
	}
	for(int i=1;i<=b-n+1;i++){
		dq.push_back(1);
		for(int j=2;j<=a;j++){
			while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
			while(!dq.empty()&&minn[dq.front()][i]>=minn[j][i]) dq.pop_back();
			dq.push_back(j);
			if(j>=n) minm[j-n+1][i]=minn[dq.front()][i];
		}
		while(!dq.empty()) dq.pop_front();
	}
	for(int i=1;i<=a-n+1;i++)
		for(int j=1;j<=b-n+1;j++)
			ans=min(ans,abs(maxm[i][j]-minm[i][j]));
	printf("%lld",ans);
	return 0;
} 
2024/7/26 22:31
加载中...