Logo Universal Online Judge

UOJ

时间限制:8 s 空间限制:1024 MB
Statistics

【题目背景】
『为什么会变成这样呢……第一次有了喜欢的人。有了能做一辈子朋友的人。两件快 乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。得到的,本该是像梦境一般 幸福的时间……但是,为什么,会变成这样呢……』
【题目描述】
给出一个 n × n 的网格图,我们称第 i 行的第 j 个格子为 (i, j),其信息用 vi,j 描述, 每个格子要么是障碍(用 vi,j = −1 表示),要么写着一个正整数 vi,j。
我们称位置 (a, b) 能到达位置 (c, d) 当且仅当:
• $(a, b) \neq (c, d)。 $
• $v_{a,b}\neq −1,vc,d\neq −1$,即两个格子都不是障碍。
•$ ∃(p_0, q_0),(p_1, q_1), . . . ,(p_k, q_k), s.t.(p_0, q_p) = (a, b),(p_k, q_k) = (c, d),∀(p_i , q_i), v_{pi,qi}\neq −1,∀0 ≤ i < k, p_i ≤ p_{i+1}, q_i ≤ q_{i+1}, p_{i+1} + q_{i+1} − p_i − q_i = 1$,即 (a, b) 可以通过若 干次移动到右边或下边的非障碍格子到达 (c, d)。
请对于所有 (a, b) 能到达 (c, d),求出$ v_{a,b} · v_{c,d}$ 的和。
【输入格式】
从文件 reach.in 读入。
第一行一个正整数 n。
接下来 n 行,每行 n 个整数,第 i 行的第 j 个整数表示 v_{i,j}。
【输出格式】 输出到文件 reach.out。
输出一行一个非负整数,表示答案。
【样例输入 1】

3
1 1 1
1 ‐1 1
‐1 1 1
【样例输出 1】

12
【样例输入 2】

5
1 5 5 2 2
2 2 ‐1 1 4
5 ‐1 3 ‐1 1
5 2 4 5 2
2 2 ‐1 1 2
【样例输出 2】

742
【样例输入 3】 见 reach/reach3.in
【样例输出 3】 见 reach/reach3.ans
【样例输入 4】 见 reach/reach4.in
【样例输出 4】 见 reach/reach4.ans
【测试点约束】
subtask 1(20pts):n ≤ 50
subtask 2(30pts):n ≤ 500
subtask 3(50pts):n ≤ 3 × 10^3
对于所有数据,满足 $1 ≤ n ≤ 3 × 10^3,v_{i,j} ∈ [1, 100] ∪ {−1}$
注意读入量较大,在 reach/qio.cpp 中下发了快读快写,你可以在其基础上进行修改。