「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,每次询问一个子矩阵中有多少个连通分量? 同一个连通分量中 ...
随机推荐
- 如何预测股票分析--长短期记忆网络(LSTM)
在上一篇中,我们回顾了先知的方法,但是在这个案例中表现也不是特别突出,今天介绍的是著名的l s t m算法,在时间序列中解决了传统r n n算法梯度消失问题的的它这一次还会有令人杰出的表现吗? 长短期 ...
- JS字符串的不可变性
js中的字符串特性->不可变性,字符串的值是不可变的 1.改变字符串中的字符 var str = "hello"; str[1] = "W"; conso ...
- Js将字符串转换成对象或数组en
举个例子 var test='{ colkey: "col", colsinfo: "NameList" }' a.将文本转换成对象 var test='{ c ...
- Eugeny and Array(思维)
Eugeny has array a = a1, a2, ..., an, consisting of n integers. Each integer ai equals to -1, or to ...
- 解释查询和本地查询 区分 Enumerable 和 Queryable
https://www.cnblogs.com/gosky/p/5757575.html 简单介绍:Enumerable 和 Queryable 他们都是静态类,位于命名控件 System.Linq下 ...
- 对于一些stl自定义比较函数
1.unorderd_map自定义键 自定义类型 struct my_key { int num; string name; }; 1.由于unordered_map是采用哈希实现的,对于系统的类型i ...
- java 面试架构篇
1.非功能需求会考虑哪些? 可用性.扩展性.性能: 2.有没有遇到过建了索引反而变慢的情况? 3.从哪些角度去设计系统? 4.代码中使用过的设计模式?
- 消息队列(六)--- RocketMQ-消息消费
文章部分图片来自参考资料,侵删 概述 我们从前面的发送流程知道某个主题的消息到了broker 的 messageque 里,假如让我们来设计一个消息队列的消费者过程,那么多个消费者应该如何消费数量较少 ...
- angular 页面中引入静态 PDF 文件
在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件 常用的几种PDF预览代码片段如下: 方法一: <object type="application/pdf" ...
- 动态链接--运行时加载dlopen
前面我们在编译可执行文件时,如果可执行文件要依赖某个so.必须要通过-L指定so路径,并且-l指定so名字. 而且在可执行文件运行时,要先加载so的load部分到进程地址空间. 有一种方式可以在编译时 ...