首页 > 其他分享 >最大面积(冬季每日一题 8)

最大面积(冬季每日一题 8)

时间:2022-11-20 15:02:28浏览次数:43  
标签:冬季 int max 每日 面积 -- res calc tt


给定一个 最大面积(冬季每日一题 8)_单调栈最大面积(冬季每日一题 8)_i++_02 矩阵,矩阵下标从 最大面积(冬季每日一题 8)_i++_03

最大面积(冬季每日一题 8)_数据_04 个询问,第 最大面积(冬季每日一题 8)_数据_05 个询问为:将矩阵中 (最大面积(冬季每日一题 8)_数据_06) 的元素改成 最大面积(冬季每日一题 8)_i++_03 之后,只包含 最大面积(冬季每日一题 8)_#include_08

注意:

  1. 每次询问均是独立的。
  2. 询问方格内元素可能本来就是 最大面积(冬季每日一题 8)_数据_09
  3. 子矩阵的面积是指矩阵的大小。

输入格式
第一行包含两个整数 最大面积(冬季每日一题 8)_单调栈_10

接下来 最大面积(冬季每日一题 8)_#include_11 行,每行包含 最大面积(冬季每日一题 8)_数据_12最大面积(冬季每日一题 8)_i++_02

再一行包含整数 最大面积(冬季每日一题 8)_数据_04

接下来 最大面积(冬季每日一题 8)_数据_04 行,每行包含 最大面积(冬季每日一题 8)_#include_16 个整数 (最大面积(冬季每日一题 8)_数据_06)。

输出格式
每个询问输出一行一个结果,表示最大面积。

数据范围
对于 20% 的数据,最大面积(冬季每日一题 8)_#include_18
对于 50% 的数据,最大面积(冬季每日一题 8)_数据_19
对于 100% 的数据,最大面积(冬季每日一题 8)_i++_20
输入样例:

4 2
10
11
11
11
3
0 0
2 0
3 1

输出样例:

6
3
4

#include<iostream>
#include<cstring>

using namespace std;

const int N = 2010;

int n, m;
int l[N], r[N], q[N], s[N][N];
int U[N], D[N], L[N], R[N];
char g[N][N];

int calc(int h[], int n){

h[0] = h[n + 1] = -1;
int tt = 0;
q[0] = 0;
for(int i = 1; i <= n; i++){

while(h[q[tt]] >= h[i]) tt--;
l[i] = q[tt];
q[++tt] = i;
}

tt = 0;
q[0] = n + 1;
for(int i = n; i >= 1; i--){

while(h[q[tt]] >= h[i]) tt--;
r[i] = q[tt];
q[++tt] = i;
}
int res = 0;
for(int i = 1; i <= n; i++)
res = max(res, h[i] * (r[i] - l[i] - 1));

return res;
}


void init(){

for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
if(g[i][j] == '1') s[i][j] = s[i-1][j] + 1;
else s[i][j] = 0;

U[i] = max(U[i-1], calc(s[i], m));
}

memset(s, 0, sizeof s);
for(int i = n; i; i--){
for(int j = 1; j <= m; j++)
if(g[i][j] == '1') s[i][j] = s[i + 1][j] + 1;
else s[i][j] = 0;
D[i] = max(D[i+1], calc(s[i], m));
}

memset(s, 0, sizeof s);
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++)
if(g[j][i] == '1') s[i][j] = s[i - 1][j] + 1;
else s[i][j] = 0;
L[i] = max(L[i - 1], calc(s[i], n));
}

memset(s, 0, sizeof s);
for(int i = m; i; i--){
for(int j = 1; j <= n; j++)
if(g[j][i] == '1') s[i][j] = s[i + 1][j] + 1;
else s[i][j] = 0;
R[i] = max(R[i + 1], calc(s[i], n));
}
}


int main(){

scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%s", g[i] + 1);

init();

int t;
scanf("%d", &t);

while(t--){

int x, y;
scanf("%d%d", &x, &y);

x++, y++;
printf("%d\n", max(max(U[x-1], D[x+1]), max(L[y-1], R[y+1])));
}

return 0;
}


标签:冬季,int,max,每日,面积,--,res,calc,tt
From: https://blog.51cto.com/u_15236041/5871450

相关文章

  • 每日算法之判断是不是平衡二叉树
    JZ79判断是不是平衡二叉树描述输入一棵节点数为n二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balan......
  • 100009 求扇形周长面积已知半径和度数
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='求扇形周长面积......
  • 2022-11-19 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 100008 求圆环面积已知大小圆直径
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***求圆环面积已知......
  • 100007 求半圆周长面积已知直径
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***求半圆周长面积......
  • 每日算法之翻转单词序列
    JZ73翻转单词序列描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它......
  • 2022-11-18 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 100006 求圆周长面积已知直径
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***求圆周长面积已......
  • 100005 求梯形面积已知下底上底高
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';/***求梯形面积已知......
  • 自己制作一个bing每日图片API
    上代码 <?php$str=file_get_contents('http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');//从bing获取数据if(preg_match('/<url>([^<]+)<\/url>/isU'......