QOJ.ac

QOJ

Límite de tiempo: 9 s Límite de memoria: 1024 MB Puntuación total: 10

#1385. 巨大的树 [A]

Estadísticas

Bajtazar 为他的女朋友 Algolina 买了一棵巨大的树作为圣诞礼物。这虽然是一份不同寻常的礼物,但 Bajtazar 是一位算法工程师,Algolina 已经习惯了这样的惊喜。

正如你所料,这棵树并不是植物,而是一个连通的无环图。它非常巨大,但可以用一种结构化的方式来描述。它的顶点被分为 $n$ 层。第一层仅包含一个顶点——树的根。每个顶点仅在下一层有子节点,最后一层的顶点除外,它们是叶子节点。对于区间 $[1, n - 1]$ 中的每个 $i$,第 $i$ 层的每个顶点都有 $a_i$ 个子节点。

Algolina 为了向 Bajtazar 展示她有多喜欢这份礼物,决定和他玩一个游戏。她选择了树中的某个顶点 $A$,而 Bajtazar 选择了顶点 $B$(可能与 Algolina 选择的相同)。现在两人轮流行动,从 Algolina 开始,给树的顶点涂色——Algolina 涂红色,Bajtazar 涂蓝色。游戏开始时,所有顶点都是白色的。每个顶点将被涂色恰好一次——由 Algolina 或 Bajtazar 涂色。在任何时候,轮到行动的玩家都可以将任意一个白色顶点涂成自己的颜色,包括顶点 $A$ 和 $B$。

当所有顶点都被涂色后,两人计算各自的得分。Algolina 的得分(记为 $S_A$)是所有红色顶点到顶点 $A$ 的距离之和,而 Bajtazar 的得分(记为 $S_B$)是所有蓝色顶点到顶点 $B$ 的距离之和。两个顶点之间的距离定义为它们之间最短路径上的边数。Algolina 的目标是使她相对于 Bajtazar 的优势最大化,即最大化 $S_A - S_B$,而 Bajtazar 的目标是将其最小化。

Bajtazar 很快注意到,这是一个完全信息有限博弈,假设双方都采取最优策略,可以计算出最终的差值。他希望你能帮他计算出这个差值。由于结果可能非常大,你只需要输出其对 $10^9 + 7$ 取模后的结果。此外,由于在一次游戏后忘记礼物是不礼貌的,你必须计算多种 $A$ 和 $B$ 选择方案下的最终得分差。

输入格式

第一行包含两个整数 $n$ 和 $q$ ($2 \le n \le 300\,000, 1 \le q \le 300\,000$),分别表示树的层数和游戏方案的数量。

第二行包含一个由 $n - 1$ 个整数组成的序列 $a_1, a_2, \dots, a_{n-1}$ ($2 \le a_i \le 300\,000$),含义如题所述。

接下来的 $q$ 行包含后续游戏方案中顶点 $A$ 和 $B$ 的描述。可以证明,最终结果仅取决于顶点 $A$ 所在的层、顶点 $B$ 所在的层以及 $A$ 和 $B$ 的最低公共祖先所在的层。因此,输入中仅给出了这些层的编号,依次为 $W_A, W_B$ 和 $W_{LCA(A,B)}$ ($1 \le W_{LCA(A,B)} \le W_A, W_B \le n$)。

输出格式

输出应包含 $q$ 行,其中第 $i$ 行应包含第 $i$ 种游戏方案的最终得分差,结果对 $10^9 + 7$ 取模。

样例

输入 1

3 3
3 2
3 2 1
1 1 1
2 3 2

输出 1

4
1
1000000003

说明

样例中的树由三层组成,第一层有一个顶点,第二层有三个,第三层有六个。

在第二个游戏方案中,Algolina 和 Bajtazar 都选择了根节点。在最优策略下,他们应该按照层号非递增的顺序选择顶点,最终结果为 $(2 + 2 + 2 + 1 + 1) - (2 + 2 + 2 + 1 + 0) = 1$。

第三个游戏方案的结果为 $-4$,但请注意,在这种情况下应输出 $-4 \pmod{10^9 + 7} = 10^9 + 3$。

子任务

  • 在某些测试组中,树最多有 $300\,000$ 个顶点,且 $q \le 100$。
  • 在其他测试组中,$q \le 100$。

对于上述每种情况,至少存在一个对应的测试组。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.