#P7598. [APIO2021] 六边形领域

[APIO2021] 六边形领域

题目背景

本题只支持 C++ 提交,提交时不需要包含 hexagon.h 头文件,只需要将附件中的 hexagon.h 中的内容粘贴到代码的开头即可。

题目描述

对于一个用六边形无限平铺的平面,Pak Dengklek 站在其中一个格子上,并称该格子为初始格子。如果六边形平铺中的两个格子有公共边,则称它们是相邻的格子。对于一步移动,Pak Dengklek 可以从一个格子向六个可能的方向(从 1166 编号,如下图所示)移动到与其相邻的格子上。

对于某个由 NN 次行动构成的行动序列,Pak Dengklek 可以用其产生的路径(对应一个按序访问的格子序 列)构造一个领域。其中第 ii 次行动由移动方向 D[i]D[i] 和在该方向上的移动步数 L[i]L[i] 组成,并且该路径应有如下性质:

  • 路径是 封闭 的,这意味着在格子序列中,起点格子与终点格子(即初始格子)相同。
  • 路径是 简单 的,这意味着在格子序列中,除了初始格子访问过恰好两次(起点和终点分别访问一 次),其他格子只能被访问至多一次。
  • 路径是 暴露 的,这意味着在格子序列中,每个格子与至少一个不在序列中出现过的非 内部格子 相邻。
    • 如果一个格子不在格子序列中出现过,并且从它出发,在不经过格子序列中任何格子的情况下,(通过若干步移动) 只能访问到有限个格子,我们就称该格子是 内部格子

下图是一个符合上述条件的路径例子。其中:

  • 11 号格子(粉色)是初始格子。
  • 被编号的格子(淡蓝色)组成格子序列,编号代表它被访问的顺序。
  • 被标上叉号的格子(深蓝色)是 内部格子

构造出的领域只包含所有路径上的格子和内部格子。领域中格子 cc 的距离定义为:在只经过领域中包含格子的情况下,从初始格子出发到达 cc 所需要的最少移动步数。领域中一个格子的分数定义为 A+d×BA+d \times B,其中 AABB 是 Pak Dengklek 给定的常数,dd 是该格子在领域中的距离。下图给出了用上示路径构成的领域中每个格子的距离。

请帮助 Pak Dengklek 计算,用给出的行动序列构成的领域中,所有格子的分数之和。由于总分数值可能很大,最终结果对 109+7{10}^9+7 取模。

你需要实现下列函数:

int draw_territory(int N, int A, int B, int[] D, int[] L)

  • NN:行动序列中行动的次数。
  • A,BA,B:分数计算中的常数。
  • DD:大小为 NN 的数组,其中 D[i]D[i] 表示第 ii 次行动的方向。
  • LL:大小为 NN 的数组,其中 L[i]L[i] 表示第 ii 次行动的移动步数。
  • 函数应该返回用给出的行动序列所构成的领域中,所有格子的分数总和对 109+7{10}^9+7 取模后的值。
  • 该函数将被调用恰好一次。

输入格式

示例测试程序按如下格式读取输入数据:

  • 11 行:NN AA BB
  • 2+i2+i0iN10 \le i \le N-1)行:D[i]D[i] L[i]L[i]

输出格式

示例测试程序按如下格式输出你的答案:

  • 11 行:draw_territory 的返回值。
17 2 3
1 2 3 4 5 4 3 2 1 6 2 3 4 5 6 6 1
1 2 2 1 1 1 1 2 3 2 3 1 6 3 3 2 1
1003

提示

【样例解释】

考虑下列调用:

draw_territory(17, 2, 3,
			   [1, 2, 3, 4, 5, 4, 3, 2, 1, 6, 2, 3, 4, 5, 6, 6, 1],
			   [1, 2, 2, 1, 1, 1, 1, 2, 3, 2, 3, 1, 6, 3, 3, 2, 1])

该行动序列和上述题面中给出的例子相同。下表列出了该领域中所有可能的距离值所对应的分数。

距离值 格子数 每个格子分数 总分数
00 11 2+0×3=22+0 \times 3=2 1×2=21 \times 2=2
11 44 2+1×3=52+1 \times 3=5 4×5=204 \times 5=20
22 55 2+2×3=82+2 \times 3=8 5×8=405 \times 8=40
33 66 2+3×3=112+3 \times 3=11 6×11=666 \times 11=66
44 2+4×3=142+4 \times 3=14 4×14=564 \times 14=56
55 33 2+5×3=172+5 \times 3=17 3×17=513 \times 17=51
66 44 2+6×3=202+6 \times 3=20 4×20=804 \times 20=80
77 2+7×3=232+7 \times 3=23 4×23=924 \times 23=92
88 55 2+8×3=262+8 \times 3=26 5×26=1305 \times 26=130
99 33 2+9×3=292+9 \times 3=29 3×29=873 \times 29=87
1010 44 2+10×3=322+10 \times 3=32 4×32=1284 \times 32=128
1111 55 2+11×3=352+11 \times 3=35 5×35=1755 \times 35=175
1212 22 2+12×3=382+12 \times 3=38 2×38=762 \times 38=76

总分数值为 2+20+40+66+56+51+80+92+130+87+128+175+76=10032+20+40+66+56+51+80+92+130+87+128+175+76=1003

因此,draw_territory 应该返回 10031003

【数据范围】

  • 3N2×1053 \le N \le 2\times {10}^5
  • 0A,B1090 \le A,B \le {10}^9
  • 1D[i]61 \le D[i] \le 60iN10 \le i \le N-1)。
  • 1L[i]1 \le L[i]0iN10 \le i \le N-1)。
  • LL 中的元素之和不超过 109{10}^9
  • 给出的行动序列所对应的路径一定是 封闭简单暴露 的。

【子任务】

  1. (3 分):N=3N=3B=0B=0
  2. (6 分):N=3N=3
  3. (11 分):LL 中的元素之和不超过 20002000
  4. (12 分):B=0B=0LL 中的元素之和不超过 2×1052\times {10}^5
  5. (15 分):B=0B=0
  6. (19 分):LL 中的元素之和不超过 2×1052\times {10}^5
  7. (18 分):L[i]=L[i+1]L[i]=L[i+1]0iN20 \le i \le N-2)。
  8. (16 分):无附加限制。