牛客多校第三场F Planting Trees 单调栈
Planting Trees
题意
给出一个矩阵,求最大矩阵面积满足该矩阵中任2元素的绝对值之差小于等于M T<1000) (n<500)但是题目明示单组(n*3)可过
分析
又是矩阵问题,单调栈的第n次出现?这一题和之前的题不同的是,边界界定没有以前那么直白,变成了绝对值的问题,绝对值问题可以转化成最大最小的问题,那么如何枚举矩阵呢?不同于之前的简单的连续性可以传递的矩阵问题,这一题要枚举矩阵的上下边界,那枚举了上下边界如果计算当前上下边界上的矩形的最大面积,那就要用到单调栈了,固定上边界维护每一列的最大值最小值,并以此值来维护单调队列,以一个类似双指针的形式即可求出最大值。
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
const int maxn=500+5;
int q1[maxn],q2[maxn],a[maxn][maxn],rowmin[maxn],rowmax[maxn];
int n,m,t;
long long ans=0;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int k=1;k<=n;k++)rowmin[k]=rowmax[k]=a[i][k];
for(int j=i;j<=n;j++){
int head1=1,tail1=0;
int head2=1,tail2=0;
for(int k=1;k<=n;k++){
rowmin[k]=min(rowmin[k],a[j][k]);
rowmax[k]=max(rowmax[k],a[j][k]);
}
int l=1;
for(int k=1;k<=n;k++){
if(tail1<head1){
q1[++tail1]=k;
}
else {
while(tail1>=head1&&rowmin[k]<=rowmin[q1[tail1]])tail1--;
q1[++tail1]=k;
}
if(tail2<head2){
q2[++tail2]=k;
}
else {
while(tail2>=head2&&rowmax[k]>=rowmax[q2[tail2]])tail2--;
q2[++tail2]=k;
}
while(l<=k&&rowmax[q2[head2]]-rowmin[q1[head1]]>m){
l++;
if(q2[head2]<l)head2++;
if(q1[head1]<l)head1++;
}
ans=max(ans,1ll*(k-l+1)*(j-i+1));
}
}
}
cout<<ans<<endl;
}
return 0;
}
牛客多校第三场F Planting Trees 单调栈的更多相关文章
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
- 2019牛客多校第三场F Planting Trees(单调队列)题解
题意: 求最大矩阵面积,要求矩阵内数字满足\(max - min < m\) 思路: 枚举上下长度,在枚举的时候可以求出每一列的最大最小值\(cmax,cmin\),这样问题就变成了求一行数,要 ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- 2019年牛客多校第三场 F题Planting Trees(单调队列)
题目链接 传送门 题意 给你一个\(n\times n\)的矩形,要你求出一个面积最大的矩形使得这个矩形内的最大值减最小值小于等于\(M\). 思路 单调队列滚动窗口. 比赛的时候我的想法是先枚举长度 ...
- 2019牛客暑期多校训练营(第三场) F.Planting Trees(单调队列)
题意:给你一个n*n的高度矩阵 要你找到里面最大的矩阵且最大的高度差不能超过m 思路:我们首先枚举上下右边界,然后我们可以用单调队列维护一个最左的边界 然后计算最大值 时间复杂度为O(n*n*n) # ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第三场 A—pacm team (4维背包加路径压缩)
链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 Eddy was a contestant participating , Eddy fail ...
随机推荐
- gulp常用插件之gulp-useref使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-useref这是一款可以将HTML引用的多个CSS和JS合并起来,减小依赖的文件个数,从而减少浏览器发起的请求次数.gulp-usere ...
- densenet思路 以及和残差网络区别,pytorch实现
densenet思路 以及和残差网络区别,pytorch实现 待办 densenet思路以及和残差网络区别.以及densenet的pytorch实现 https://zhuanlan.zhihu.co ...
- eclipse配置文件出现小红叉,Referenced file contains errors (xml文件第一行小红叉错误)
原文链接:https://blog.csdn.net/zlj1217/article/details/61432437 ...
- 论文阅读笔记(八)【IEEEAccess2019】:High-Resolution and Low-Resolution Video Person Re-Identification: A Benchmark
Introduction (1)Motivation: 监控视频中的行人,有的比较清晰,有的因为距离较远非常模糊. 在高低分辨率方面的行人重识别缺乏数据集和研究. (2)Contribution: ① ...
- kindle怎么导入电子书
参考网址:https://jingyan.baidu.com/article/59a015e342a165f795886545.html
- 【Unity|C#】基础篇(16)——文件读写(I/O类)
[笔记] 文件操作 File / FileInfo / FileStream https://www.runoob.com/csharp/csharp-file-io.html 文本读写 Stream ...
- MySQL启动失败故障思路
1.1 查看 日志 默认路径在数据路径下,以当前主机名加上.err命名 如主机名为tz,数据路径为/mnt/mysql_data目录下 日志文件为tz.err [root@tz mysql_data] ...
- vue页面加载前显示{{代码}}的原因及解决办法
进入正题,简单说说自己对html中出现{{}}的原因及解决办法: 这样写的话,就会出现{{}}一闪的情况: 原因:html的加载顺序: 解析html结构 -> 加载外部脚本和样式表文件 -> ...
- [TJOI2015] 线性代数 - 最大权闭合子图
展开 \(D=(AB-C)A^T\\ =\sum_{i=1}^n(\sum_{j=1}^na_jb_{j,i}-c_i)a_i\\ =\sum_{i=1}^n\sum_{j=1}^na_ia_jb_{ ...
- python中的replace无法替换字符串
replace替换字符串的时候,需要重新赋值给变量,因为在python中字符串是不可变对象,因此在使用的时候我们必须重新赋值,就这么简单. z1=z1.replace('ddd','') 返回 ...