2019牛客多校第三场F-Planting Trees(单调队列)
Planting Trees
解题思路
枚举每一个下边界,再枚举其对应的所有上边界,求出其对应区间内的最大最小值,当下边界一样的时候,其最大最小值可以随着上边界减小逐步更新。然后将这些最大最小值分别放入单调队列,初始时设左边界为1,右边界即为当前放入的下标, 高即为此时枚举的高。当当前区间的最大最小值差超过m时,让最大值与最小值中位置靠前的出队,然后左边界变为其出队的下标+1。算出每一个满足条件的面积,取最大值即可。
代码如下
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline int read(){
int res = 0, w = 0; char ch = 0;
while(!isdigit(ch)){
w |= ch == '-', ch = getchar();
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return w ? -res : res;
}
const int N = 505;
int a[N][N];
int minn[N], maxx[N];
struct T{
int i, val;
T(int val, int i): val(val), i(i){}
};
int main()
{
int t;
scanf("%d", &t);
while(t --){
int n, m;
n = read(), m = read();
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++)
a[i][j] = read();
}
int ans = 0;
for(int i = 1; i <= n; i ++){
for(int j = i; j >= 1; j --){
if(j == i){
for(int k = 1; k <= n; k ++)
minn[k] = maxx[k] = a[j][k];
}
else {
for(int k = 1; k <= n; k ++){
minn[k] = min(minn[k], a[j][k]);
maxx[k] = max(maxx[k], a[j][k]);
}
}
int dq1[N], dq2[N];
int l1, r1, l2, r2;
l1 = l2 = r1 = r2 = 0;
int l = 1;
for(int k = 1; k <= n; k ++){
while(l1 != r1 && minn[dq1[r1 - 1]] > minn[k])
-- r1;
while(l2 != r2 && maxx[dq2[r2 - 1]] < maxx[k])
-- r2;
dq1[r1 ++] = k;
dq2[r2 ++] = k;
while(l1 != r1 && l2 != r2 && maxx[dq2[l2]] - minn[dq1[l1]] > m){
int x1 = dq1[l1];
int x2 = dq2[l2];
l = min(x1, x2) + 1;
if(x1 <= x2)
l1 ++;
if(x1 >= x2)
l2 ++;
}
ans = max(ans, (i - j + 1) * (k - l + 1));
}
}
}
printf("%d\n", ans);
}
return 0;
}
2019牛客多校第三场F-Planting Trees(单调队列)的更多相关文章
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
- 2019牛客多校第三场F Planting Trees(单调队列)题解
题意: 求最大矩阵面积,要求矩阵内数字满足\(max - min < m\) 思路: 枚举上下长度,在枚举的时候可以求出每一列的最大最小值\(cmax,cmin\),这样问题就变成了求一行数,要 ...
- 牛客多校第三场F Planting Trees 单调栈
Planting Trees 题意 给出一个矩阵,求最大矩阵面积满足该矩阵中任2元素的绝对值之差小于等于M T<1000) (n<500)但是题目明示单组(n*3)可过 分析 又是矩阵问题 ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- 2019牛客暑期多校训练营(第三场) F.Planting Trees(单调队列)
题意:给你一个n*n的高度矩阵 要你找到里面最大的矩阵且最大的高度差不能超过m 思路:我们首先枚举上下右边界,然后我们可以用单调队列维护一个最左的边界 然后计算最大值 时间复杂度为O(n*n*n) # ...
- 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019年牛客多校第三场 F题Planting Trees(单调队列)
题目链接 传送门 题意 给你一个\(n\times n\)的矩形,要你求出一个面积最大的矩形使得这个矩形内的最大值减最小值小于等于\(M\). 思路 单调队列滚动窗口. 比赛的时候我的想法是先枚举长度 ...
- 2019牛客多校第三场D BigInteger——基础数论
题意: 用 $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mo ...
随机推荐
- JS-监听整个页面上的DOM树变化
# [在线预览](https://jsfiddle.net/1010543618/fyf913t0/) ## 方法 - 使用<Web API 接口>的<MutationObserve ...
- java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】
转: java 实现一套流程管理.流转的思路(伪工作流) 在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理. 以下提 ...
- TTL 与 CMOS
Frm: https://blog.csdn.net/qq_27745395/article/details/76687175 http://baijiahao.baidu.com/s?id=1598 ...
- tarjam 模板改编
思路要灵活 邻接表涉及数组问题,可以用vector代替
- 利用HTML制作一个简单的界面(工具HBuilder)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...
- fedora 25重新安装引导
引导区被其他系统给覆盖了,重新安装引导 grub2-install /dev/sdb GRUB_SAVEDEFAULT=true BIOS grub2-mkconfig -o /boot/grub2/ ...
- Vue篇1
2019 Vue 面试题汇总(持续更新中...) 1. vue中的MVVM模式 即Model-View-ViewModel. Vue是以数据为驱动的,Vue自身将DOM和数据进行绑定,一旦创建绑定,D ...
- Python判断一个字符串中是否存在多个子串中的一个
在使用python的开发过程中,常常需要判断,字符串中是否存在子串的问题, 但判断一个字符串中是否存在多个字串中的一个时,如if (a or b) in c或者if x contains a|b|c| ...
- python基础之数据类型初始
变量 贴标签 变量名规则:只能是字母下划线和数字组成,不能以数字开头,不能和关键字同名,不能使用拼音和中文,具有可描述性,区别大小写,变量名推荐写法:驼峰提,下划线(官方推荐) 变量赋值 常量 特性: ...
- OpenSuSe开启sshd服务
需要测试OpenSuSE11 x64上mysql性能,发现很多东西与centos以及红帽有差别.其中最切身的就是sshd服务的开启. 安装好OpenSuSE 11后,发现ssh连接不上去,可以ping ...