点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m;cin>>n>>m;
int nn,mm;cin>>nn>>mm;
vector<vector<int>>t(n+1,vector<int>(m+1,0));
vector<vector<int>>sum(n+1,vector<int>(m+1,0));
vector<vector<int>>qmax(n+1,vector<int>(m+1,0)),qqmax(n+1,vector<int>(m+1,0));
vector<vector<int>>qmin(n+1,vector<int>(m+1,inf)),qqmin(n+1,vector<int>(m+1,inf));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>t[i][j];
for(int i=1;i<=n;i++)
{
//存储编号
deque<int>q;
for(int j=1;j<=m;j++)
{
if(!q.empty()&&j-q.front()>=mm) q.pop_front();
while(!q.empty()&&t[i][q.back()]<t[i][j]) q.pop_back();
q.push_back(j);
if(j>=mm) qmax[i][j]=t[i][q.front()];
}
q.clear();
for(int j=1;j<=m;j++)
{
if(!q.empty()&&j-q.front()>=mm) q.pop_front();
while(!q.empty()&&t[i][q.back()]>t[i][j]) q.pop_back();
q.push_back(j);
if(j>=mm) qmin[i][j]=t[i][q.front()];
}
}
for(int j=mm;j<=m;j++)
{
deque<int>q;
for(int i=1;i<=n;i++)
{
if(!q.empty()&&i-q.front()>=nn) q.pop_front();
while(!q.empty()&&qmax[q.back()][j]<qmax[i][j]) q.pop_back();
q.push_back(i);
if(i>=nn) qqmax[i][j]=qmax[q.front()][j];
}
q.clear();
for(int i=1;i<=n;i++)
{
if(!q.empty()&&i-q.front()>=nn) q.pop_front();
while(!q.empty()&&qmin[q.back()][j]>qmin[i][j]) q.pop_back();
q.push_back(i);
if(i>=nn) qqmin[i][j]=qmin[q.front()][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+t[i][j];
}
}
int ans=0;
for(int i=nn;i<=n;i++)
{
for(int j=mm;j<=m;j++)
{
int s=sum[i][j]-sum[i-nn][j]-sum[i][j-mm]+sum[i-nn][j-mm];
ans=max(ans,s*(qqmax[i][j]-qqmin[i][j]));
}
}
cout<<ans<<"\n";
return 0;
}