Planting Trees

给定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';
}
}

最新文章

  1. hive
  2. Android 生成LayoutInflater的三种方式
  3. flexbox 的相关属性的运用
  4. 简单登录实例Login
  5. 如何配置使用 Log4j
  6. iOS-JavaScript向WKWebView传值
  7. sqlite与android交互 (封装)
  8. 批量插入数据 C# SqlBulkCopy使用
  9. js button onclick动作赋值操作
  10. DataReader 链接关闭解惑篇
  11. QML学习笔记之三
  12. 【CSS】Intermediate2:Grouping and Nesting
  13. QML 语言基础
  14. QT中QWidget类简介
  15. css中换行的几种方式
  16. IOS学习之路六(UITableView滑动删除指定行)
  17. java 数据结构 栈的实现
  18. install xdebug
  19. 3n+1猜想——模拟
  20. Python&#160;基于python+mysql浅谈redis缓存设计与数据库关联数据处理

热门文章

  1. ESXi导出的CentOS7 ovf文件导入到workstation 无法打开GUI登录界面的问题解决方案
  2. JS事件绑定的两种形式
  3. Nginx 2.安装与部署配置
  4. 牛客练习赛51 C 勾股定理
  5. [LeetCode] 103. 二叉树的锯齿形层次遍历
  6. Python 入门之数据类型之间的相互转换 以及 在编程中会遇到的数据类型的坑
  7. 搜索专题: HDU1501Zipper
  8. 用Java构建一个简单的WebSocket聊天室
  9. MySQL时间戳加减转日期
  10. sql 字符串 切割函数 FUN_Split