【发布时间】:2015-03-09 18:56:44
【问题描述】:
给定一个大小为N×M的矩形网格,即1≤x≤N,1≤y≤M有单元格(x,y)。
如果两个单元格共享一条边,则它们是相邻的。更正式地说,如果 |x1 − x2|,则两个单元 (x1, y1), (x2, y2) 是相邻的+ |y1 - y2| = 1. 在两个相邻的单元格之间可以有一堵墙。如果两个单元格 a 和 b 之间有路,则它们是相连的(换句话说,存在一系列单元格 c[1]、c[2]、...、c[k] 使得 c[1] = a , c[k] = b, 并且对于每个 1 ≤ i
现在给我们Q个查询,每个查询有以下四种。
- 1 x y - 在单元格 (x, y) 和 (x, y+1) 之间构建墙。如果它们之间已经存在一堵墙,则忽略此查询。
- 2 x y - 在单元格 (x, y) 和 (x+1, y) 之间构建墙。如果它们之间已经存在一堵墙,则忽略此查询。
- 3 x1 y1 x2 y2 - 检查单元格 (x1, y1) 和 (x2, y2) 是否已连接。此查询的答案是“是”或“否”
- 4 - 我们需要知道最大连接组件的大小。连接组件是一组销售,其中每两个单元都连接。连接组件的大小是其中的单元数。
注意:我们可以假设在查询之前网格上没有墙。
现在给定 N 、 M 和 Q 查询,我们需要告诉类型 3 和 4 查询的答案。
我的方法:我目前正在考虑通过制作一个图表然后为每个查询做 dfs 之类的事情来做到这一点。这种方法可以提高效率还是有其他更好的方法来解决这个问题?
网格的大小最大为 1000 X 1000。查询次数最多可达 10^6
示例:让 N=3 和 M=4 开始时,我们被问到类型 3 的查询,即 (1,1) 连接到 (3,4),然后答案是 YES,如前所述网格是这样的:
http://postimg.org/image/5qoug2dov/
现在假设我们有类型 1 和 2 的查询,并且网格变成这样:
http://postimg.org/image/tm14jtg9h/
现在同一个查询 3 的答案是否定的
【问题讨论】:
-
As seen on CodeChef,2015 年 3 月长期挑战赛的一部分。