#P13470. [GCJ 2008 #3] How Big Are the Pockets?

[GCJ 2008 #3] How Big Are the Pockets?

Description

Polygonovich 教授是 Flatland 的一位诚实市民,他喜欢在平面上的整数点之间进行随机行走。他每天早晨从原点出发,面朝北方。他有三种行动方式:

  • 'F':向前移动一个单位长度。
  • 'L':向左转 9090 度。
  • 'R':向右转 9090 度。

一天结束时(是的,他走了很久!),他会回到原点。他在行走过程中,除了原点外,绝不会两次经过同一个点,因此他的路径围成了一个多边形。下图中,多边形的内部被涂成了蓝色(暂时忽略 xxyyzzww 这几个点,稍后会解释):

注意,只要 Polygonovich 教授转弯次数超过 44 次,这个多边形就不是凸多边形,因此会出现“口袋”区域。

注意! 为了增加难度,我们对“口袋”的定义可能与你以往听说的不同。

下图中灰色区域表示多边形的口袋。

形式化地说,一个点 pp 被认为在口袋中,当且仅当它不在多边形内部,并且满足以下两个条件之一:

  • pp 的正东和正西方向上都存在边界点;或者
  • pp 的正北和正南方向上都存在边界点。

边界点指的是 Polygonovich 先生在行走过程中经过的所有点(包括所有点,不仅限于整数坐标点)。

再看上面的第一张图。点 xx 满足第一个条件;yy 同时满足两个条件;zz 满足第二个条件。这三个点都在口袋中。点 ww 不在口袋中。

给定 Polygonovich 教授的行走路径,请你计算所有口袋区域的总面积。

Input Format

输入的第一行是测试用例数 NN。接下来有 NN 组测试数据。

每组测试数据描述了 Polygonovich 教授的一次行走。每组数据以一个整数 LL 开头。接下来是 LL 个 "S T" 对,其中 SS 是仅由 'L'、'R'、'F' 组成的字符串,TT 是一个整数,表示 SS 重复的次数。

换句话说,每组测试数据的输入格式如下: S1S_1 T1T_1 S2S_2 T2T_2 ... SLS_L TLT_L

实际的行动序列是 T1T_1S1S_1,接着 T2T_2S2S_2,依此类推,拼接而成。

同一组测试数据中的 "S T" 对可能不会全部在同一行,但字符串 SS 不会被拆分到多行。下面的第二个样例演示了这一点。

Output Format

对于每组测试数据,输出一行,格式为 "Case #XX: YY",其中 XX 是测试用例编号(从 11 开始),YY 是所有口袋区域的总面积。

2
1
FFFR 4
9
F 6 R 1 F 4 RFF 2 LFF 1
LFFFR 1 F 2 R 1 F 5
Case #1: 0
Case #2: 4

Hint

样例解释

下图展示了两个样例测试数据的情况。

数据范围

  • 1N1001 \leqslant N \leqslant 100
  • 1T1 \leqslant T(上界见下述“小数据集”和“大数据集”说明)
  • 输入拼接后的路径中不会出现连续的方向变化(即不会有 'LL'、'RR'、'LR' 或 'RL'),并且路径中至少包含一个 'F'。
  • 路径不会自交,除了起点和终点重合,并且最终会回到原点。

小数据集(5 分,测试点 1 - 可见)

  • 1L1001 \leqslant L \leqslant 100
  • 每个字符串 SS 的长度为 111616
  • 教授不会经过绝对值大于 100100 的点。

大数据集(10 分,测试点 2 - 隐藏)

  • 1L10001 \leqslant L \leqslant 1000
  • 每个字符串 SS 的长度为 113232
  • 教授不会经过绝对值大于 30003000 的点。

由 ChatGPT 4.1 翻译