CF274E Mirror Room

题目描述

给定一个 $n \times m$ 的网格,其中有一些格子被阻塞。网格中左上角的格子的坐标是 $(1,1)$,右下角的格子的坐标是 $(n,m)$。一共有 $k$ 个被阻塞的格子,其余格子都是空的。你从某个空白格子 $(x_{s}, y_{s})$ 的中心向一个对角方向(即东北、北西、东南或西南)发射一束激光。如果激光击中了阻塞格子或网格的边界,它就会发生反射。激光反射的不同情况如下图所示。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF274E/b39481b94e1363a19d54d5d4b6abfa8c6904b83d.png) 经过一段时间后,激光会进入无限循环。请统计激光至少经过一次的空格的数量。如果激光经过了某个格子的中心,则认为经过了该格子。

输入格式

第一行包含三个整数 $n$、$m$、$k$,$1 \leq n,m \leq 10^5$,$0 \leq k \leq 10^5$。接下来的 $k$ 行,每行包含两个整数 $x_{i}$、$y_{i}$,$1 \leq x_{i} \leq n, 1 \leq y_{i} \leq m$,表示第 $i$ 个被阻塞格子的位置。 最后一行包含 $x_{s}$、$y_{s}$ 和发射方向("NE"、"NW"、"SE" 或 "SW")。这些字符串分别表示方向 $(-1, 1)$、$(-1, -1)$、$(1, 1)$、$(1, -1)$。 保证没有两个阻塞格子的坐标相同。

输出格式

输出一行,表示激光至少经过一次的空格数量。 请不要在 C++ 中使用 %lld 格式读取或输出 64 位整数,推荐使用 cin、cout 流或 %I64d 格式。

说明/提示

由 ChatGPT 5 翻译