单调队列30分求调
查看原帖
单调队列30分求调
759098
tangzirui1016楼主2024/10/30 21:13
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,n,ans=1e10;
int f[1005][1005];
int ma[1005][1005],mi[1005][1005];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>a>>b>>n;
	for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) cin>>f[i][j];
	for(int i=1;i<=a;i++){
		deque<int>mx,mm;
		for(int j=1;j<=b;j++){
			if(!mx.empty()&&mx.front()==j-n) mx.pop_front();
			while(!mx.empty()&&f[i][mx.back()]<=f[i][j]) mx.pop_back();
			mx.push_back(j);
			if(j>=n) ma[i][j]=f[i][mx.front()];
			if(!mm.empty()&&mm.front()==j-n) mm.pop_front();
			while(!mm.empty()&&f[i][mm.back()]>=f[i][j]) mm.pop_back();
			mm.push_back(j);
			if(j>=n) mi[i][j]=f[i][mm.front()];
		}
	}
	//for(int i=1;i<=a;i++) for(int j=n;j<=b;j++) cout<<ma[i][j]<<(j==b?'\n':' ');
	//for(int i=1;i<=a;i++) for(int j=n;j<=b;j++) cout<<mi[i][j]<<(j==b?'\n':' ');
	
	for(int j=n;j<=b;j++){
		deque<int>mx,mm;
		for(int i=1;i<=a;i++){
			if(!mx.empty()&&mx.front()==i-n) mx.pop_front();
			while(!mx.empty()&&ma[mx.front()][j]<=ma[i][j]) mx.pop_back();
			mx.push_back(i);
			if(!mm.empty()&&mm.front()==i-n) mm.pop_front();
			while(!mm.empty()&&mi[mm.front()][j]>=mi[i][j]) mm.pop_back();
			mm.push_back(i);
			if(i>=n){
				ans=min(ans,ma[mx.front()][j]-mi[mm.front()][j]);
				//cout<<ma[mx.front()][j]<<' '<<mi[mm.front()][j]<<' '<<ans<<'\n';
			} 
		}
	}
	cout<<ans;
	return 0;
}

马蜂良好,将就着看吧

2024/10/30 21:13
加载中...