「AT2381 [AGC015C] Nuske vs Phantom Thnook」
题目大意
给出一个01矩阵,这个矩阵有一个特殊的性质: 对于任意两个 \(1\) 之间最多只有 \(1\) 条由 \(1\) 构成的路径.每次询问给出一个矩形范围,查询在这个范围内的联通快个数.
分析
先从给出的性质出发,可以发现如果在所有相邻的 \(1\) 之间连上一条边(双向边)以后这个性质就转化成了在这若干个 \(1\) 所组成的图中不会出现环,在仔细思考一下,不会出现环,而且是双向边,这意味着什么?没错,这是一片森林(由很多树组成),对于每一颗树就是一个联通快了,可以发现这既然是树,那么如果它被残忍地切开后它仍然是一颗树,于是对于矩阵查询并不会对于每个联通块都是一棵树这个性质产生影响,于是就很容易想到树有什么性质,其中有一个非常特殊的性质,一棵有 \(N\) 个节点的树中有且只有 \(N-1\) 条边,那么矩阵中的点的个数 \(-\) 矩阵中相邻的 \(1\) 所形成的边的个数 \(=\) 矩阵中树的个数,至于计算部分,二维前缀和搞一下就好了,可以做到 \(O(1)\) 查询.
代码
#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int maxN=2333;
int N,M,T;
int arr[maxN][maxN];
int sum[maxN][maxN];
//对于竖着的边和横着的边需要不同处理
int suml[maxN][maxN];
int sumr[maxN][maxN];
int main()
{
scanf("%d%d%d",&N,&M,&T);
char ch;
REP(i,1,N)
{
REP(j,1,M)
{
cin>>ch;
arr[i][j]=ch-'0';
sum[i][j]=arr[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];//二维前缀,记录1出现的次数
if(arr[i][j])
{
if(arr[i-1][j])//如果有竖着的边
{
suml[i][j]++;
}
if(arr[i][j-1])//如果有横着的边
{
sumr[i][j]++;
}
}
//处理二维前缀
suml[i][j]+=suml[i-1][j]+suml[i][j-1]-suml[i-1][j-1];
sumr[i][j]+=sumr[i-1][j]+sumr[i][j-1]-sumr[i-1][j-1];
}
}
int fx,fy,lx,ly,answer;
REP(i,1,T)
{
scanf("%d%d%d%d",&fx,&fy,&lx,&ly);
//按照公式计算
answer=sum[lx][ly]-sum[lx][fy-1]-sum[fx-1][ly]+sum[fx-1][fy-1];
//竖着的的边的数量与横着的边的数量计算方式略有不同,如果不能理解可以画一张图来帮助理解
answer-=suml[lx][ly]+suml[fx][fy-1]-suml[lx][fy-1]-suml[fx][ly];
answer-=sumr[lx][ly]+sumr[fx-1][fy]-sumr[lx][fy]-sumr[fx-1][ly];
printf("%d\n",answer);
}
return 0;
}
「AT2381 [AGC015C] Nuske vs Phantom Thnook」的更多相关文章
- [agc015c]nuske vs phantom thnook
题意: 有一个n*m的网格图,每个格子是蓝色或白色.四相邻的两个格子连一条边,保证蓝格子构成一个森林. 有q组询问,每次询问给出一个矩形,问矩形内蓝格子组成的联通块个数. $1\leq n,m\leq ...
- AtCoder:C - Nuske vs Phantom Thnook
C - Nuske vs Phantom Thnook https://agc015.contest.atcoder.jp/tasks/agc015_c 题意: n*m的网格,每个格子可能是蓝色, 可 ...
- Nuske vs Phantom Thnook
Nuske vs Phantom Thnook Time limit : 4sec / Memory limit : 256MB Score : 700 points Problem Statemen ...
- [NOIP2019模拟赛][AT2381] Nuske vs Phantom Thnook
题目链接 评测姬好快啊(港记号?)暴力40pts变成60pts 因为题目说了保证蓝色点两两之间只有一条路径,所以肯定组成了一棵树,而对于每次询问的x1,y1,x2,y2的子矩阵中就存在着一个森林 不难 ...
- AGC 015C.Nuske vs Phantom Thnook(思路 前缀和)
题目链接 闻本题有格子,且何谓格子也 \(Description\) 给定\(n*m\)的蓝白矩阵,保证蓝格子形成的的同一连通块内,某蓝格子到达另一个蓝格子的路径唯一. \(Q\)次询问.每次询问一个 ...
- AGC015 C Nuske vs Phantom Thnook(前缀和)
题意 题目链接 给出一张$n \times m$的网格,其中$1$为蓝点,$2$为白点. $Q$次询问,每次询问一个子矩阵内蓝点形成的联通块的数量 保证任意联通块内的任意蓝点之间均只有一条路径可达 S ...
- AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook
题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...
- Atcoder C - Nuske vs Phantom Thnook(递推+思维)
题目链接:http://agc015.contest.atcoder.jp/tasks/agc015_c 题意:给一个n*m的格,蓝色的组成路径保证不成环,q个询问,计算指定矩形区域内蓝色连通块的个数 ...
- C - Nuske vs Phantom Thnook
题意:n*m矩阵,n,m<=2e3,矩阵中的1能走到相邻4个1上,0代表障碍,若两个1联通 则只有一条路径 q个询问,q<=2e5,每次询问一个子矩阵中有多少个连通分量? 同一个连通分量中 ...
随机推荐
- 13.56Mhz下直接阻抗匹配调试步骤
直接匹配阻抗,天线与射频芯片在同一块板子,调试步骤与50欧姆阻抗匹配调试天线参数差不多,多了一部分射频芯片端的滤波部分的参数计算.下面介绍调试过程. 1.首先看一下射频芯片发射部分原理图:分析原理图时 ...
- AcWing 861. 二分图的最大匹配 匈牙利算法
#include <cstring> #include <iostream> #include <algorithm> using namespace std; , ...
- Qt QQuickView设置成无边框无标题栏
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...
- jmeter巧用自增长型变量
实现目的 在进行性能测试时,某些请求中的参数值并不允许被重复使用,比如账号的创建.开通授权等服务,这时就需要在jmeter中构造一些自增长型的变量,供后续请求使用,以解决参数值重复的问题. 脚本实现 ...
- weinre 真机调试
1.在任意文件夹 安装weinre cnpm -g install weinre 2.启动 weinre --httpPort 8009 --boundHost -all- 3.在你的页面中加入 本机 ...
- c# pcm
using System; using System.IO; using System.Text; using System.Windows.Forms; using System.Runtime.I ...
- NET com组件注册
1.签名 右击项目->属性->[签名]标签, 选中[为程序集签名]–>[选择强名称密钥文件]–>[新建],输入你的密钥名称,去掉[使用密码保护密钥文件] 最重要的签名,并且注册 ...
- Win10安装.Net Framework4.7及更高版本
问题描述 使用VS打开项目工程时,提示未安装.net framework4.7,但在启用或关闭windows功能里已经勾选了.net framework 4.7的全部功能. 直接从网上下载.net f ...
- GitBook的账号注册和安装使用(一)
1.GitBook账号注册 GitBook原注册地址 https://legacy.gitbook.com/join 改为: https://www.gitbook.com/ (1)注册账号:htt ...
- 【visio】 图片
1.背景页设置 新建背景页:新建页面>设计>页面设置>页属性 使用背景页:在页属性页的"背景" 选项里,选择需要的背景. 2.插入图片 支持插入本地图片 ...