Planting Trees
2024-09-05 20:20:44
给定N*N矩阵,求子矩形满足里面最大元素最小元素之差不超过M
单调队列
枚举上边界,下边界,及右边界,
用两个单调队列,一个维护最大值,一个维护最小
求左边界
#include<bits/stdc++.h>
using namespace std;
int A[][];
#define sc(x) scanf("%d",&x);
int ma[];
int mi[];
int q1[];
int q2[];
int main()
{
int T,N,M;
sc(T);
while(T--){
sc(N);sc(M);
for(int i=;i<=N;i++){
for(int j=;j<=N;j++){
sc(A[i][j]);
}
}
int ans=;
for(int i=;i<=N;i++){///上
for(int j=;j<=N;j++)ma[j]=,mi[j]=1e5+;
for(int j=i;j<=N;j++){///下
for(int k=;k<=N;k++){///列
ma[k]=max(ma[k],A[j][k]);
mi[k]=min(mi[k],A[j][k]);
} int l1=,l2=,r1=,r2=;
for(int k=,p=;k<=N;k++){
for(;l1<r1&&ma[q1[r1-]]<ma[k];)r1--;
for(;l2<r2&&mi[q2[r2-]]>mi[k];)r2--;
q1[r1++]=k,q2[r2++]=k;
for(;l1<r1&&l2<r2&&ma[q1[l1]]-mi[q2[l2]]>M;){
if(q1[l1]<q2[l2])p=q1[l1++];
else p=q2[l2++];
}//p位置不取
ans=max(ans,(j-i+)*(k-p));
}
}
}
cout<<ans<<'\n';
}
}
最新文章
- hive
- Android 生成LayoutInflater的三种方式
- flexbox 的相关属性的运用
- 简单登录实例Login
- 如何配置使用 Log4j
- iOS-JavaScript向WKWebView传值
- sqlite与android交互 (封装)
- 批量插入数据 C# SqlBulkCopy使用
- js button onclick动作赋值操作
- DataReader 链接关闭解惑篇
- QML学习笔记之三
- 【CSS】Intermediate2:Grouping and Nesting
- QML 语言基础
- QT中QWidget类简介
- css中换行的几种方式
- IOS学习之路六(UITableView滑动删除指定行)
- java 数据结构 栈的实现
- install xdebug
- 3n+1猜想——模拟
- Python&#160;基于python+mysql浅谈redis缓存设计与数据库关联数据处理