[CSP-S模拟测试]:任(duty)(二维前缀和)
题目描述
$liu\_runda$退役之后就失去梦想开始咸鱼生活了……
$Bilibili$夏日画板活动中,所有人都可以在一块画板上进行像素画创作。$UOJ$群有一群无聊的人决定在画板上创作一个$50\times 50$的$UOJ$的$LOGO$。如下图:
这块画板实际上是很大的矩形网格。一个网格是一像素。
一个人每三分钟才能画一个像素。所以$liu\_runda$的咸鱼生活非常无聊。
郭神表示他实在是看不下去$liu\_runda$这只颓狗了,于是随手出了一道神题,$liu\_runda$不会做,于是给出到联考里了。
在画板上有一片黑白相间的矩形区域满足这样的性质:如果认为相同颜色的方块可以在上下左右四个方向连通,那么任意两个黑色方块要么不连通,要么连通但之间只有一条简单路径(不重复经过同一个格子的路径)。
这个矩形区域有$N$行$M$列,从上到下依次为第$1,2,3...N-1,N$行,从左到右依次为第$1,2,3...M-1,M$列。
每次郭神会询问这片矩形区域内的一个子矩形。在只考虑这个子矩形内的像素时(即从子矩形内部不能和子矩形之外的像素相连通),问这个子矩形内的黑色方块组成了多少连通块。
如果不能完成这个任务,$liu\_runda$就会被郭神批判一番……
输入格式
第一行三个整数$N$,$M$,$Q$,表示矩形区域有$N$行$M$列,有$Q$组询问。
接下来$N$行,每行一个长为$M$的$01$字符串。$0$表示白色,$1$表示黑色。第$i$行第$j$个字符表示第$i$行$j$列的颜色。
接下来$Q$行,每行$4$个整数$x_1,y_1,x_2,y_2,(x1<=x2,y1<=y2)$表示选出的矩形区域的两个对角。即选出一个左上角为第$x_1$行第$y_1$列,右下角为第$x_2$行第$y_2$列,包含$x_2-x_1+1$行,$y_2-y_1+1$列的区域。
输出格式
$Q$行,第$i$行一个整数$ans$表示第$i$组询问的答案。
样例
样例输入1:
3 4 4
1101
0110
1101
1 1 3 4
1 1 3 1
2 2 3 4
1 2 2 4
样例输出1:
3
2
2
2
样例输入2:
5 5 6
11010
01110
10101
11101
01010
1 1 5 5
1 2 4 5
2 3 3 4
3 3 3 3
3 1 3 5
1 1 3 4
样例输出2:
3
2
1
1
3
2
数据范围与提示
对于第$1,2$个测试点,$Q=1$。
对于第$3,4$个测试点,$N=1$。
对于第$5,6,7$个测试点,$N=2$。
对于第$8$个测试点,$N,M\leqslant 1,000$。
对于第$9$个测试点,$N,M\leqslant 1500$。
对于全部测试点,$1\leqslant N,M\leqslant 2,000,1\leqslant Q\leqslant 200,000,1\leqslant x_1\leqslant x_2\leqslant N,1\leqslant y_1\leqslant y_2\leqslant M$,保证任意两个黑色像素之间最多只有一条简单路径。
题解
题目应该不是很难懂,手膜一下样例就好了。
$70\%$算法:
暴力$DFS$看有几个联通块就好了。
时间复杂度:$\Theta(Q\times N\times M)$。
期望得分:$70$分。
实际得分:$70$分。
$100\%$算法:
看到$Q$这么大,前面的同学居然在想二维莫队,但是本蒟蒻并不会,所以我就想了前缀和。
显然前缀和不好搞,先来了解一个性质吧,在无环无向图中,联通块的个数=点数-边数。
注意是无环无向图,题目中恰巧给出了这一点,所以我们可以利用这条性质,去解决这道题。
那么,如何解决呢?
维护三个二维前缀和,二维前缀和想必大家都会,在此不再赘述。
就来说一下这三个前缀和都是什么吧:所有黑块的前缀和,横向连边的前缀和,纵向连边的前缀和。
有了这三个前缀和,我们就有了点数和边数,也就可以利用上面的那条性质了。
然而还有一点需要注意的就是边的前缀和的边界条件,就拿横向连边举例子,如下图中,我们需要计算蓝色区域联通块的个数:
那么我们在处理横向连边的时候需要注意红线位置的边,那些便也需要剪掉,方法就是在剪掉前缀和的时候将其$x$坐标右移一位即可。
时间复杂度:$\Theta(N\times M+Q)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
bool Map[3000][3000];
char ch[3000];
int rx,ry,cx,cy,ans;
int dp[3][3000][3000];
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
Map[i][j]=ch[j]-'0';
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
dp[0][i][j]=dp[0][i-1][j]+dp[0][i][j-1]-dp[0][i-1][j-1]+Map[i][j];
dp[1][i][j]=dp[1][i-1][j]+dp[1][i][j-1]-dp[1][i-1][j-1];
dp[2][i][j]=dp[2][i-1][j]+dp[2][i][j-1]-dp[2][i-1][j-1];
if(Map[i][j]&&Map[i-1][j])dp[1][i][j]++;
if(Map[i][j]&&Map[i][j-1])dp[2][i][j]++;
}
while(q--)
{
ans=0;
scanf("%d%d%d%d",&rx,&ry,&cx,&cy);
ans =dp[0][cx][cy]-dp[0][rx-1][cy]-dp[0][cx][ry-1]+dp[0][rx-1][ry-1];
ans-=dp[1][cx][cy]-dp[1][rx ][cy]-dp[1][cx][ry-1]+dp[1][rx ][ry-1];
ans-=dp[2][cx][cy]-dp[2][rx-1][cy]-dp[2][cx][ry ]+dp[2][rx-1][ry ];
printf("%d\n",ans);
}
return 0;
}
rp++
[CSP-S模拟测试]:任(duty)(二维前缀和)的更多相关文章
- [CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)
题目传送门(内部题26) 输入格式 第一行有$3$个整数$n,m,q$.然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子.然后有$q$行,每行$2$个整数$x,y ...
- [CSP-S模拟测试]:蔬菜(二维莫队)
题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...
- [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania
[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...
- 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...
- Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )
题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...
- 【AcWing 99】激光炸弹——二维前缀和
(题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- poj-3739. Special Squares(二维前缀和)
题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. ...
随机推荐
- [Udemy] ES 7 and Elastic Stack - part 1
Section 1 基本概念: Index(indices) 相当于 关系型数据库的 table, document 相当于关系型数据库的 row, 还有一个type的概念(可以理解为table的s ...
- 如何搭建Vue环境?
搭建vue的开发环境: https://cn.vuejs.org/v2/guide/installation.html 1. 必须要安装nodejs cnpm 下载包的速度更快一些. 地址: ...
- python基础-4.1 open 打开文件练习:修改haproxy配置文件
1.如何在线上环境优雅的修改配置文件? 配置文件名称ini global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 in ...
- vsphere虚拟化之Active Directory域的创建(一)
1.搭建环境说明 本机是在Vmware Workstation 12 Pro虚拟软件下进行搭建的. 操作系统版本:Windows Server 2012 R2 简体中文企业版x64. 2.安装完win ...
- jdk下载安装后为什么要设置环境变量?
因为电脑不知道javac这个命令是在C:\Program Files\JAVA\jdk1.8.0_65\bin的这个路径下面,所以我们要设置好环境变量,来让电脑知道其路径
- python程序daemon化
1 直接空格加& python flask_server.py & 最简单的方式 这样还不行,不知道为什么flask server会自动退出. $ nohup python flask ...
- 小白学Python(11)——pyecharts,绘制饼图 Pie
Pie-基本示例 from example.commons import Faker from pyecharts import options as opts from pyecharts.char ...
- 深入ArrayList看fast-fail机制
fail-fast机制简介 什么是fail-fast fail-fast 机制是java集合(Collection)中的一种错误机制.它只能被用来检测错误,因为JDK并不保证fail-fast机制一定 ...
- ES6精解:变量的解构赋值
1.数组的解构赋值 我们知道以前我们给一个变量赋值要这样如下: let a = 1; let b = 2; let c = 3; 但是ES6出来之后,我们可以这样: let [a, b, c] = [ ...
- C# 中常见的控件以及功能
1.StatusBar控件——显示各种状态信息. StatusBar控件可以有状态栏面板(用于显示图标以指示状态)或一系列动画图标(用于指示某个进程正在工作,例如,表示正在保存文档的 Microsof ...