#L3990. 「IOI2023」足球场

「IOI2023」足球场

题目描述

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

森林的每个单元格要么是空的(可用于建造),要么是有树的(不可用),且至少有一个空单元格。

DVSC 俱乐部计划修建足球场,球场的定义与规则如下:

1. 球场的定义

大小为 sss1s \ge 1)的球场,是 ss 个互不相同的空单元格集合 $\{(r_0, c_0), (r_1, c_1), \ldots, (r_{s-1}, c_{s-1})\}$,需满足:

  • 对所有 0i<s0 \le i \lt s,单元格 (ri,ci)(r_i, c_i) 是空的(F[ri][ci]=0F[r_i][c_i] = 0);
  • 对所有 0i<j<s0 \le i \lt j \lt srirjr_i \neq r_jcicjc_i \neq c_j 中至少有一个成立(即任意两个单元格不同时在同一行且同一列)。

2. 直传的定义

直传是以下两种动作之一:

  • 行直传:若球场包含第 rr 行中单元格 (r,a)(r,a)(r,b)(r,b) 之间的全部单元格,则球可从 (r,a)(r,a) 传递到 (r,b)(r,b)aba \neq b)。具体包含关系为:
    • a<ba < b,则球场需包含所有满足 akba \le k \le b 的单元格 (r,k)(r, k)
    • a>ba > 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)aba \neq b)。具体包含关系为:
    • a<ba < b,则球场需包含所有满足 akba \le k \le b 的单元格 (k,c)(k, c)
    • a>ba > b,则球场需包含所有满足 bkab \le k \le a 的单元格 (k,c)(k, c)

3. 规则球场的定义

若通过至多 2 次直传,可将球从球场的任意单元格传递到另一任意单元格,则该球场是“规则的”。注意,大小为 11 的球场必然是规则的。 ![](file://MSVyV_AuKtjyuhCiT6xY9.png)

你的任务是找出森林中可建造的最大规则球场的大小 ss

实现细节

需在程序开始引入库 soccer.h,并实现以下函数:

int biggest_stadium(int N, int[][] F)

参数说明

  • NN:森林的大小(即方格为 N×NN \times N);
  • FF:描述森林的二维数组,F[r][c]=0F[r][c] = 0 表示单元格 (r,c)(r,c) 为空,F[r][c]=1F[r][c] = 1 表示有树。

返回要求

返回可建造的最大规则球场的大小 ss。每个测试用例中,该函数仅被调用一次。

例子

考虑以下函数调用:

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]])

该例子中,森林里仅有 (1,0)(1,0)(4,2)(4,2) 两个单元格有树,其余均为空。可建造的最大规则球场大小为 2020(总空单元格数为 2323,但部分空单元格无法组成更大的规则球场),因此函数返回 2020。 ![](file://P4iukAiFF16X9sgqj-uPg.png)

约束条件

  • 1N20001 \le N \le 2000
  • 对所有 0i<N0 \le i \lt N0j<N0 \le j \lt NF[i][j]{0,1}F[i][j] \in \{0, 1\}
  • 森林中至少有一个空单元格(即存在 i,ji,j 使得 F[i][j]=0F[i][j] = 0)。

子任务

子任务 附加限制 分值
1 至多只有一个单元格有树 66
2 N3N \le 3 88
3 N7N \le 7 2222
4 N30N \le 30 1818
5 N500N \le 500 1616
6 无额外约束 3030

子任务部分分规则

对于每个子任务,若程序能正确判定“全部空单元格组成的集合是否为规则球场”,可获得该子任务 25%25\% 的部分分,具体规则如下:

  1. 若全部空单元格组成规则球场:
    • 程序返回空单元格总数(正确答案)→ 得该测试用例满分;
    • 程序返回其他值 → 得 00 分。
  2. 若全部空单元格不组成规则球场:
    • 程序返回正确答案 → 得该测试用例满分;
    • 程序返回空单元格总数 → 得 00 分;
    • 程序返回其他值 → 得该测试用例 25%25\% 的分数。

每个子任务的最终得分,取该子任务所有测试用例得分的最小值。

评测程序示例

输入格式

  1. 11 行:整数 NN
  2. 2+i2+i 行(0i<N0 \le i \lt N):NN 个整数,依次表示 F[i][0],F[i][1],,F[i][N1]F[i][0], F[i][1], \ldots, F[i][N-1]

输出格式

11 行:函数 biggest_stadium 的返回值。