B. Nanami's Digital Board

题目连接:

http://www.codeforces.com/contest/434/problem/B

Description

Nanami is an expert at playing games. This day, Nanami's good friend Hajime invited her to watch a game of baseball. Unwilling as she was, she followed him to the stadium. But Nanami had no interest in the game, so she looked around to see if there was something that might interest her. That's when she saw the digital board at one end of the stadium.

The digital board is n pixels in height and m pixels in width, every pixel is either light or dark. The pixels are described by its coordinate. The j-th pixel of the i-th line is pixel (i, j). The board displays messages by switching a combination of pixels to light, and the rest to dark. Nanami notices that the state of the pixels on the board changes from time to time. At certain times, certain pixels on the board may switch from light to dark, or from dark to light.

Nanami wonders, what is the area of the biggest light block such that a specific pixel is on its side. A light block is a sub-rectangle of the board, in which all pixels are light. Pixel (i, j) belongs to a side of sub-rectangle with (x1, y1) and (x2, y2) as its upper-left and lower-right vertex if and only if it satisfies the logical condition:

((i = x1 or i = x2) and (y1 ≤ j ≤ y2)) or ((j = y1 or j = y2) and (x1 ≤ i ≤ x2)).

Nanami has all the history of changing pixels, also she has some questions of the described type, can you answer them?

Input

The first line contains three space-separated integers n, m and q (1 ≤ n, m, q ≤ 1000) — the height and width of the digital board, and the number of operations.

Then follow n lines, each line containing m space-separated integers. The j-th integer of the i-th line is ai, j — the initial state of pixel (i, j).

If ai, j = 0, pixel (i, j) is initially dark.

If ai, j = 1, pixel (i, j) is initially light.

Then follow q lines, each line containing three space-separated integers op, x, and y (1 ≤ op ≤ 2; 1 ≤ x ≤ n; 1 ≤ y ≤ m), describing an operation.

If op = 1, the pixel at (x, y) changes its state (from light to dark or from dark to light).

If op = 2, Nanami queries the biggest light block with pixel (x, y) on its side.

Output

For each query, print a single line containing one integer — the answer to Nanami's query.

Sample Input

3 4 5

0 1 1 0

1 0 0 1

0 1 1 0

2 2 2

2 1 2

1 2 2

1 2 3

2 2 2

Sample Output

0

2

6

Hint

题意

给你一个01矩阵,然后有两个操作,1是将x y取反,2是问以x,y为边界的最大全1矩形的面积是多少

题解:

其实就是瞎暴力……

一看数据范围,只要能做到修改操作是o(n)和查询操作是o(n)的就好了

这个直接用单调栈那种思想,直接暴力去莽一波就好了

对于每一个格子维护四个值,l[x][y],r[x][y],u[x][y],d[x][y]表示这个格子最多往四个方向延展多少

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int a[maxn][maxn],n,m,q,up[maxn][maxn],down[maxn][maxn],l[maxn][maxn],r[maxn][maxn];
int x,y,op;
void update()
{
a[x][y]=1-a[x][y];
for(int j=1;j<=m;j++)
if(a[x][j])
l[x][j]=l[x][j-1]+1;
else
l[x][j]=0;
for(int j=m;j>=1;j--)
if(a[x][j])
r[x][j]=r[x][j+1]+1;
else
r[x][j]=0;
for(int i=1;i<=n;i++)
if(a[i][y])
up[i][y]=up[i-1][y]+1;
else
up[i][y]=0;
for(int i=n;i>=1;i--)
if(a[i][y])
down[i][y]=down[i+1][y]+1;
else
down[i][y]=0;
}
void query()
{
if(a[x][y]==0)
{
printf("0\n");
return;
}
int ans = 0;
int U=1e9,D=1e9,L=1e9,R=1e9;
for(int i=y;i>=1;i--)
{
U=min(U,up[x][i]);
D=min(D,down[x][i]);
ans=max(ans,(U+D-1)*(y-i+1));
}
U=1e9,D=1e9,L=1e9,R=1e9;
for(int i=y;i<=m;i++)
{
U=min(U,up[x][i]);
D=min(D,down[x][i]);
ans=max(ans,(U+D-1)*(i-y+1));
}
U=1e9,D=1e9,L=1e9,R=1e9;
for(int i=x;i>=1;i--)
{
L=min(L,l[i][y]);
R=min(R,r[i][y]);
ans=max(ans,(L+R-1)*(x-i+1));
}
U=1e9,D=1e9,L=1e9,R=1e9;
for(int i=x;i<=n;i++)
{
L=min(L,l[i][y]);
R=min(R,r[i][y]);
ans=max(ans,(L+R-1)*(i-x+1));
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(a[i][j])
l[i][j]=l[i][j-1]+1;
for(int j=m;j>=1;j--)
if(a[i][j])
r[i][j]=r[i][j+1]+1;
}
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
if(a[i][j])
up[i][j]=up[i-1][j]+1;
for(int i=n;i>=1;i--)
if(a[i][j])
down[i][j]=down[i+1][j]+1;
}
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)update();
else query();
}
}

Codeforces Round #248 (Div. 1) B. Nanami's Digital Board 暴力 前缀和的更多相关文章

  1. Codeforces Round #248 (Div. 1) D - Nanami's Power Plant 最小割

    D - Nanami's Power Plant 思路:类似与bzoj切糕那道题的模型.. #include<bits/stdc++.h> #define LL long long #de ...

  2. 构造水题 Codeforces Round #206 (Div. 2) A. Vasya and Digital Root

    题目传送门 /* 构造水题:对于0的多个位数的NO,对于位数太大的在后面补0,在9×k的范围内的平均的原则 */ #include <cstdio> #include <algori ...

  3. Codeforces Round #248 (Div. 2) (ABCD解决问题的方法)

    比赛链接:http://codeforces.com/contest/433 A. Kitahara Haruki's Gift time limit per test:1 second memory ...

  4. Codeforces Round #248 (Div. 1)——Nanami&#39;s Digital Board

    题目连接 题意: 给n*m的0/1矩阵,q次操作,每次有两种:1)将x,y位置值翻转 2)计算以(x,y)为边界的矩形的面积最大值 (1 ≤ n, m, q ≤ 1000) 分析: 考虑以(x,y)为 ...

  5. Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note

    题目链接:http://codeforces.com/contest/433/problem/C 思路:可以想到,要把某一个数字变成他的相邻中的数字的其中一个,这样总和才会减少,于是我们可以把每个数的 ...

  6. Codeforces Round #248 (Div. 2)C 题

    题目:http://codeforces.com/contest/433/problem/C 没想到做法就各种纠结, 今天做的都快疯掉了, 太弱了, 等题解一出,就各种恍然大悟 不应该不应该 正文: ...

  7. Codeforces Round #248 (Div. 1) A. Ryouko's Memory Note 水题

    A. Ryouko's Memory Note 题目连接: http://www.codeforces.com/contest/434/problem/A Description Ryouko is ...

  8. Codeforces Round #248 (Div. 2) B称号 【数据结构:树状数组】

    主题链接:http://codeforces.com/contest/433/problem/B 题目大意:给n(1 ≤ n ≤ 105)个数据(1 ≤ vi ≤ 109),当中有m(1 ≤ m ≤  ...

  9. Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones

    题目简单描述就是求数组中[l,r]区间的和 #include <iostream> #include <vector> #include <string> #inc ...

随机推荐

  1. 高级C#信使(译) - Unity维基百科

    高级C#信使 作者:Ilya Suzdalnitski 译自:http://wiki.unity3d.com/index.php/Advanced_CSharp_Messenger 描述 前言 Mis ...

  2. oracle11g的冷热备份

    1.冷备份 如果数据库可以正常关闭,而且允许关闭足够长的时间,那么就可以采用冷备份(脱机备份),可以是归档冷备份,也可以是非归档冷备份.其方法是首先关闭数据库,然后备份所有的物理文件,包括数据文件.控 ...

  3. docker stack 部署容器监控方案(cAdvisor、Prometheus、Grafana)

    =============================================== 2018/7/8_第1次修改                       ccb_warlock === ...

  4. js 去除字符串所有空格

    function trim(str){ return str.replace(/\s|\xA0/g,""); }

  5. SpringCloud Config Bus webhook 只能刷新config server 不能刷新config client

    在 https://github.com/spring-cloud/spring-cloud-bus/issues/124 中有提到 版本 SpringCloud:Greenwich.RC1 原因 由 ...

  6. 2016-2017-2 20155309南皓芯java第四周学习总结

    教材内容总结 这次我们学习的还是两章的内容,学习任务量跟上次比的话大体上来讲是差不多的. 继承与多态 继承 继承也符合DRY(Don't Repeat Yourself)原则 Role role1 = ...

  7. hdu 4642 翻硬币

    在一个n*m的棋盘上 每一个格子都有一枚硬币 1表示正面 0表示反面你每次可以选择一个硬币为正面的点,然后从该点与右下角点形成的矩阵硬币全都反向,直到一个人没有硬币可以选择则输Alice先手 列举了几 ...

  8. 使用Kafka、Elasticsearch、Grafana搭建业务监控系统(三)Elasticsearch

    https://blog.csdn.net/tonywu1992/article/details/83576863

  9. Buffer对象的总结

    1.首先记录下php关于字符串长度的统计 <?php echo '<br>'; echo '<br>'; 2.Buffer对象为16进制的两位数,即FF 0-225: v ...

  10. Winsock—I/O模型之选择模型(一)

    Winsock中提供了一些I/O模型帮助应用程序以异步方式在一个或多个套接字上管理I/O. 这样的I/O模型有六种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect ...