【题目背景】
『为什么会变成这样呢……第一次有了喜欢的人。有了能做一辈子朋友的人。两件快
乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。得到的,本该是像梦境一般
幸福的时间……但是,为什么,会变成这样呢……』
【题目描述】
给出一个 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 中下发了快读快写,你可以在其基础上进行修改。