codeforces 434B B. Nanami's Digital Board(分治)
题目链接:
1 second
256 megabytes
standard input
standard output
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?
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.
For each query, print a single line containing one integer — the answer to Nanami's query.
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
0
2
6
3 3 4
1 1 1
1 1 1
1 1 1
2 2 2
1 2 2
2 1 1
2 2 1
6
3
3
题意: 给一个n*m网格,每次要么变换其中一个位置,0变1或者1变0,询问的是(x,y)为一个矩形边上一点,这个矩形全部为1,最多有多少个1;
思路:
还记得以前有一个题目是矩形宽都为1,把矩形放在一起形成的区域求其中的最大矩形的面积,当时是用的单调栈,这个只是要求4次罢了;
4次分别是这个点在矩形的上下边和左右边;
然后求一个最大面积,当然这个点一定在矩形边上,那么这个点(x,y)的高度一定是最高的,两边都是依次递减的到0,我们可以把这些高排序,然后再取最大的面积就好了;
具体的看代码吧;
AC代码:
#include <bits/stdc++.h>
/*#include <vector>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
*/
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<''||CH>'';F= CH=='-',CH=getchar());
for(num=;CH>=''&&CH<='';num=num*+CH-'',CH=getchar());
F && (num=-num);
}
int stk[], tp;
template<class T> inline void print(T p) {
if(!p) { puts(""); return; }
while(p) stk[++ tp] = p%, p/=;
while(tp) putchar(stk[tp--] + '');
putchar('\n');
} const LL mod=1e9+;
const double PI=acos(-1.0);
const LL inf=1e14;
const int N=1e5+; int n,m,q;
int a[][],h[][][],le[][][],temp[];
void Init()
{
for(int j=;j<=m;j++)
{
for(int i=;i<=n;i++)
{
if(a[i][j])h[][i][j]=h[][i-][j]+;
else h[][i][j]=;
}
for(int i=n;i>;i--)
{
if(a[i][j])h[][i][j]=h[][i+][j]+;
else h[][i][j]=;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(a[i][j])le[][i][j]=le[][i][j-]+;
else le[][i][j]=;
}
for(int j=m;j>;j--)
{
if(a[i][j])le[][i][j]=le[][i][j+]+;
else le[][i][j]=;
}
}
}
void change (int x,int y)
{
a[x][y]^=;
for(int i=x;i<=n;i++)if(a[i][y])h[][i][y]=h[][i-][y]+;else h[][i][y]=;
for(int i=x;i>;i--)if(a[i][y])h[][i][y]=h[][i+][y]+;else h[][i][y]=;
for(int i=y;i<=m;i++)if(a[x][i])le[][x][i]=le[][x][i-]+;else le[][x][i]=;
for(int i=y;i>;i--)if(a[x][i])le[][x][i]=le[][x][i+]+;else le[][x][i]=;
}
int cmp(int x,int y)
{
return x>y;
}
void solve(int x,int y)
{
int ans=,l,r;
for(int i=;i<=;i++)
{
temp[y]=h[i][x][y];
for(r=y+;r<=m&&h[i][x][r];r++)if(h[i][x][r]>temp[r-])temp[r]=temp[r-];else temp[r]=h[i][x][r];
for(l=y-;l>&&h[i][x][l];l--)if(h[i][x][l]>temp[l+])temp[l]=temp[l+];else temp[l]=h[i][x][l];
r--;l++;
sort(temp+l,temp+r+,cmp);
for(int j=l;j<=r;j++)
ans=max(ans,temp[j]*(j-l+)); temp[x]=le[i][x][y];
for(r=x+;r<=n&&le[i][r][y];r++)if(le[i][r][y]>temp[r-])temp[r]=temp[r-];else temp[r]=le[i][r][y];
for(l=x-;l>&&le[i][l][y];l--)if(le[i][l][y]>temp[l+])temp[l]=temp[l+];else temp[l]=le[i][l][y];
r--;l++;
sort(temp+l,temp+r+,cmp);
for(int j=l;j<=r;j++)
ans=max(ans,temp[j]*(j-l+));
}
print(ans);
} int main()
{
read(n);read(m);read(q);
Riep(n)Rjep(m)read(a[i][j]);
int flag,x,y;
Init();
while(q--)
{
read(flag);read(x);read(y);
if(flag==)change(x,y);
else solve(x,y);
}
return ;
}
codeforces 434B B. Nanami's Digital Board(分治)的更多相关文章
- Codeforces Round #248 (Div. 1) B. Nanami's Digital Board 暴力 前缀和
B. Nanami's Digital Board 题目连接: http://www.codeforces.com/contest/434/problem/B Description Nanami i ...
- Nanami's Digital Board CodeForces - 434B (棋盘dp)
大意: 给定01矩阵, m个操作, 操作1翻转一个点, 操作2求边界包含给定点的最大全1子矩阵 暴力枚举矩形高度, 双指针统计答案 #include <iostream> #include ...
- Nanami's Digital Board
题意: 给出点(x1,y1),求以x=x1为上边界,或下边界:以y=y1为左边界,或右边界矩形的最大值(矩形内所有的点均为1) 定义四个数组lft[][],rht[][],up[][],down[][ ...
- Codeforces Round #248 (Div. 1)——Nanami's Digital Board
题目连接 题意: 给n*m的0/1矩阵,q次操作,每次有两种:1)将x,y位置值翻转 2)计算以(x,y)为边界的矩形的面积最大值 (1 ≤ n, m, q ≤ 1000) 分析: 考虑以(x,y)为 ...
- codeforces248(div1) B Nanami's Digital Board
q次询问,每次询问能够对矩阵某一个值改变(0变1.1变0) 或者是查询子矩阵的最大面积,要求这个这个点在所求子矩阵的边界上,且子矩阵各店中全为1 用up[i][j]表示(i,j)这个点向上能走到的最长 ...
- codeforces 161D Distance in Tree 树上点分治
链接:https://codeforces.com/contest/161/problem/D 题意:给一个树,求距离恰好为$k$的点对是多少 题解:对于一个树,距离为$k$的点对要么经过根节点,要么 ...
- Codeforces 437D The Child and Zoo - 树分治 - 贪心 - 并查集 - 最大生成树
Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The ...
- Codeforces Beta Round #10 C. Digital Root 数学
C. Digital Root 题目连接: http://www.codeforces.com/contest/10/problem/C Description Not long ago Billy ...
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
随机推荐
- 错误"因为数据库正在使用,所以无法获得对数据库的独占访问权"的解决方案
今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题.现将引发该问 ...
- ActiveMQ简介与安装
开源消息总线 支持JMS1.1和J2EE 1.4规范的 JMS Provider实现(持久化,XA消息,事务) 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去 支持 ...
- 如何在我们项目中利用开源的图表(js chart)
最近觉得应该把自己在技术上的一些心得记录在博客里面跟大家分享,一起讨论,一起成长! 这篇随笔主要为介绍chart在项目中的运用,因为在我们看到一些开源的chart时候,是使 ...
- Flex SuperTabNavigator Tab标签图片不显示或图片显示不完全
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- MFC中关于子对话框中编辑框不能编辑的问题
最近在用MFC写程序.发现子对话框中的编辑框不能编辑.具体问题是这样的: 我有一个对话框YhglDlg,创建了这个对话框的子对话框ZjyhxxDlg,子对话框的Style属性为Child,Border ...
- oracle中substr函数的用法
1.substr(string string, int a, int b) 参数1:string 要处理的字符串 参数2:a 截取字符串的开始位置(起始位置是0) 参数3:b 截取的字符串的长度(而不 ...
- Scrum Planning Card
最近用Swift写了个小工具Scrum Planning Card,如果你也用scrum管理项目, 或许用这个工具可以提高你的工作效率. 另外欢迎提建议和反馈,谢谢. 欢迎关注我的微信公众号 Hope ...
- IE兼容CSS3圆角border-radius的方法(同时兼容box-shadow,text-shadow)
IE兼容CSS3圆角border-radius,box-shadow,text-shadow的方法 1.下载ie-css3.htc 2.CSS box { -moz-border-radius: 15 ...
- 树链剖分||dfs序 各种题
1.[bzoj4034][HAOI2015]T2 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把 ...
- mysql 加入列,改动列,删除列。
MySQL 加入列,改动列,删除列 ALTER TABLE:加入,改动,删除表的列,约束等表的定义. 查看列:desc 表名; 改动表名:alter table t_book rename to bb ...