CF243D Cubes

题目描述

有一天,Petya 收到了妈妈送给他的一套木制积木。Petya 立刻用这些积木搭建了一整座城市。 城市的基座是一个 $n \times n$ 的正方形,被划分为若干 $1\times 1$ 的小方格。正方形的边与坐标轴平行,对角顶点坐标分别为 $(0,0)$ 和 $(n,n)$。在每一个单位方格上,Petya 都搭建了一座由积木组成的高塔。每个积木的边长均为 $1$。 之后,Petya 走到离作品无限远的地方,并沿着向量 $v=(v_{x}, v_{y}, 0)$ 的方向观看这座城市。Petya 想知道,从这个视角看,有多少个不同的积木块能够被看见。请你帮他计算这个数字。 每个积木块包括其边界。如果存在一条射线,从该积木的某个点 $p$ 沿着 $-v$ 方向发出,并且这条射线不经过其他任何积木块,那么这个积木块是可见的。

输入格式

第一行包含三个整数 $n$、$v_{x}$ 和 $v_{y}$($1 \leq n \leq 10^{3}$,$|v_{x}|, |v_{y}| \leq 10^{4}$,$|v_{x}| + |v_{y}| > 0$)。 接下来有 $n$ 行,每行 $n$ 个整数:第 $i$ 行第 $j$ 个数 $a_{ij}$($0 \leq a_{ij} \leq 10^{9}$,$1 \leq i,j \leq n$)表示在以 $(i-1, j-1)$ 和 $(i, j)$ 为对角顶点的单位方格上建造的积木高塔的高度。

输出格式

输出一个整数,表示从指定方向能够看到的不同积木块数量。 注意:请不要在 C++ 中使用 %lld 进行 64 位整数的读写,推荐使用 cin、cout 流或 %I64d。

说明/提示

由 ChatGPT 5 翻译