#P9602. [IOI2023] 足球场

[IOI2023] 足球场

题目背景

这是一道交互题,你只需要实现代码中要求的函数。

你的代码不需要引用任何额外的头文件,也不需要实现 main 函数。

本题仅支持 C++ 语言提交。

题目描述

Debrecen 市有一片正方形的森林名叫 Nagyerdő,可以看作是 N×NN \times N 的方格。 方格的行由北向南从 00N1N - 1 编号,列由西向东从 00N1N - 1 编号。 方格中第 rr 行第 cc 列的格子被称为单元格 (r,c)(r, c)

森林里的每个单元格要么是的,要么是有树的。 森林里至少有一个空单元格。

DVSC 是这个城市最著名的体育俱乐部,目前正计划在森林里修建一座新的足球场。 大小为 ss 的球场(这里 s1s \ge 1)是 ss互不相同的空单元格 (r0,c0),,(rs1,cs1)(r_0, c_0), \ldots, (r_{s - 1}, c_{s - 1}) 的集合。 形式化地说,这意味着:

  • 对于从 00s1s - 1(包含两端)的每个 ii,单元格 (ri,ci)(r_i, c_i) 是空的;
  • 对于满足 0i<j<s0 \le i \lt j \lt s 的每组 iijjrirjr_i \neq r_jcicjc_i \neq c_j 二者中至少有一个成立。

踢球时足球在球场的单元格之间传递。 直传是以下两种动作之一:

  • 球场包含第 rr 行中单元格 (r,a)(r,a)(r,b)(r,b) 之间的全部单元格,球从单元格 (r,a)(r,a) 传递到单元格 (r,b)(r,b)0r,a,b<N,ab0 \le r,a,b \lt N, a \ne b)。包含关系的形式化定义为:
    • a<ba \lt b,则球场应包含满足 akba \le k \le b 的每个单元格 (r,k)(r,k)
    • a>ba \gt b,则球场应包含满足 bkab \le k \le a 的每个单元格 (r,k)(r,k)
  • 球场包含第 cc 列中单元格 (a,c)(a,c)(b,c)(b,c) 之间的全部单元格,球从单元格 (a,c)(a,c) 传递到单元格 (b,c)(b,c)0c,a,b<N,ab0 \le c,a,b \lt N, a \ne b)。包含关系的形式化定义为:
    • a<ba \lt b,则球场应包含满足 akba \le k \le b 的每个单元格 (k,c)(k, c)
    • a>ba \gt b,则球场应包含满足 bkab \le k \le a 的每个单元格 (k,c)(k, c)

如果可以通过至多 22 次直传将球从球场的任意单元格传递到另外的任意单元格,那么称这样的球场是规则的。 注意,任何大小为 11 的球场都是规则的。

例如,考虑一片大小为 N=5N = 5 的森林,其中单元格 (1,0)(1,0)(4,2)(4,2) 有树,其余单元格均为空。 下图显示了三个可能的球场。有树的单元格用深色表示,组成球场的单元格划有斜线。

左边的球场是规则的。然而,中间的球场不是规则的,原因是把球从单元格 (4,1)(4,1) 传递到单元格 (4,3)(4,3) 至少需要 33 次直传。右边的球场也不是规则的,原因是无法通过直传将球从单元格 (3,0)(3,0) 传递到单元格 (1,3)(1,3)

体育俱乐部希望建造尽可能大的规则球场。 你的任务是找出最大的 ss 值,使得森林里可以建造大小为 ss 的规则球场。

输入格式

你要实现以下函数:

int biggest_stadium(int N, int[][] F)
  • NN:森林的大小。
  • FF:一个长度为 NN 的数组,每个元素都是长度为 NN 的数组,用于描述森林里的单元格。对于每组满足 0r<N0 \le r \lt N0c<N0 \le c \lt NrrccF[r][c]=0F[r][c] = 0 表示单元格 (r,c)(r, c) 是空的,F[r][c]=1F[r][c] = 1 表示该单元格是有树的。
  • 这个函数应该返回森林里可以建造的规则球场的最大大小。
  • 对于每个测试用例,这个函数恰好被调用一次。

输出格式

考虑以下调用:

biggest_stadium(5, [[0, 0, 0, 0, 0],  
                    [1, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0], 
                    [0, 0, 1, 0, 0]])

这个例子描述的森林显示在下图的左边,一个大小为 2020 的规则球场显示在下图的右边:

由于不存在大小为 2121 或更大的规则球场,函数应该返回 2020

提示

约束条件

  • 1N20001 \le N \le 2\,000
  • 0F[i][j]10 \le F[i][j] \le 1(对满足 0i<N0 \le i \lt N0j<N0 \le j \lt N 的所有 iijj
  • 森林里至少存在一个空单元格。也就是说,对于某组满足 0i<N0 \le i \lt N0j<N0 \le j \lt Niijj,有 F[i][j]=0F[i][j] = 0

子任务

  1. (6 分)至多只有一个单元格有树。
  2. (8 分)N3N \le 3
  3. (22 分)N7N \le 7
  4. (18 分)N30N \le 30
  5. (16 分)N500N \le 500
  6. (30 分)没有额外的约束条件。

在每个子任务中,如果你的程序能够正确判定全部空单元格组成的集合能否构成一个规则球场,那么你将在该子任务获得 25% 的部分分。

更准确地讲,对于所有空单元格组成的集合是一个规则球场的测试用例,你的解答的得分情况如下:

  • 如果返回正确答案(也就是所有空单元格的数量),则得满分;
  • 否则得 0 分。

对于所有空单元格组成的集合不是一个规则球场的测试用例,你的解答的得分情况如下:

  • 如果返回正确答案,则得满分;
  • 如果返回所有空单元格的数量,则得 0 分;
  • 如果返回其他值,则得 25% 的分数。

每个子任务的得分是这个子任务中所有测试用例得分的最低值。

评测程序示例

评测程序示例按以下格式读取输入:

  • 11 行:NN
  • 2+i2 + i 行(0i<N0 \le i \lt N):F[i][0]  F[i][1]    F[i][N1]F[i][0] \; F[i][1] \; \ldots \; F[i][N - 1]

评测程序示例按以下格式打印你的答案:

  • 11 行:函数 biggest_stadium 的返回值