QOJ.ac

QOJ

時間限制: 6 s 記憶體限制: 256 MB 總分: 100

#10622. 涂色游戏

统计

涂色游戏(Gra w kolorowanie)的棋盘由 $n$ 个编号为 $1$ 到 $n$ 的格子组成。某些格子之间相邻。棋盘上恰好有 $n-1$ 对相邻格子,且从任意一个格子出发都可以通过相邻格子到达其他任意格子。(因此,棋盘构成一棵树。)

游戏由两名玩家参与。初始时,棋盘上所有格子均为白色,除了一个被涂成红色的格子(属于第一个玩家)和一个被涂成蓝色的格子(属于第二个玩家)。玩家轮流行动。在自己的回合中,玩家选择一个被涂成自己颜色的格子 $u$,然后将一个与 $u$ 相邻的白色格子 $v$ 涂成该颜色。无法行动的玩家输掉游戏。

我们想知道,对于哪些初始格子的选择,第一个玩家拥有必胜策略,即无论第二个玩家如何行动,第一个玩家都能获胜。

具体来说,给定格子集合 $A$ 和 $B$。请编写一个程序,计算有多少对不同的格子 $(a, b)$,使得初始红色格子编号 $a \in A$,初始蓝色格子编号 $b \in B$,且第一个玩家拥有必胜策略。

程序还需要处理集合 $A$ 和 $B$ 的更新。每次更新会向集合 $A$ 或 $B$ 中添加或删除一个格子。请在每次更新后输出满足条件的对数。

输入格式

第一行包含一个整数 $n$ ($1 \le n \le 500\,000$),表示棋盘上的格子数。

接下来的 $n-1$ 行描述棋盘;第 $i$ 行包含两个整数 $u$ 和 $v$ ($1 \le u, v \le n$),表示编号为 $u$ 和 $v$ 的格子相邻。

下一行包含三个整数 $S_A, S_B, q$ ($1 \le S_A, S_B \le n, 0 \le q \le 500\,000$),分别表示集合 $A$ 的初始大小、集合 $B$ 的初始大小以及更新次数。

下一行包含 $S_A$ 个来自 $\{1, \dots, n\}$ 的不同整数,表示属于集合 $A$ 的格子编号。再下一行包含 $S_B$ 个来自 $\{1, \dots, n\}$ 的不同整数,表示属于集合 $B$ 的格子编号。

接下来的 $q$ 行描述集合的更新;第 $i$ 行包含两个字符 $z, t$ 和一个整数 $w$,由空格分隔 ($z \in \{A, B\}, t \in \{+, -\}, 1 \le w \le n$)。字符 $z$ 表示操作的集合;字符 $t$ 表示操作类型($+$ 表示添加格子,$ -$ 表示删除格子);整数 $w$ 表示被添加或删除的顶点编号。你可以假设每次更新都会改变集合(即在执行 $+$ 操作前 $w$ 不在集合中,在执行 $-$ 操作前 $w$ 在集合中)。

在初始状态以及更新过程中,集合 $A$ 和 $B$ 不一定是不相交的。请注意,在统计满足 $a \in A$ 且 $b \in B$ 的格子对 $(a, b)$ 时,必须满足 $a \neq b$。

输出格式

你的程序应输出 $q+1$ 行;第 $i$ 行应包含一个整数,表示在前 $i-1$ 次更新后集合 $A$ 和 $B$ 满足条件的对数。(特别地,第一行应包含初始集合 $A$ 和 $B$ 的对数。)

样例

输入 1

6
1 2
2 3
3 4
3 5
5 6
1 2 1
1
5 6
A + 2

输出 1

1
3

说明 1

初始时 $A = \{1\}$,$B = \{5, 6\}$。我们有两种选择初始格子 $(a, b)$ 的可能:对 $(1, 5)$ 和对 $(1, 6)$。对于对 $(1, 5)$,第一个玩家必须涂色格子 $2$,第二个玩家涂色格子 $3$,第一个玩家无法行动。对于对 $(1, 6)$,第一个玩家涂色格子 $2$,第二个玩家必须涂色格子 $5$,第一个玩家涂色格子 $3$,第二个玩家无法行动。因此,第一个玩家仅在对 $(1, 5)$ 时有必胜策略;故答案为 $1$。

更新集合后,$A = \{1, 2\}$,$B = \{5, 6\}$。第一个玩家在对 $(1, 5), (2, 5)$ 和 $(2, 6)$ 时拥有必胜策略;故答案为 $3$。

子任务

测试集分为以下子任务。每个子任务包含一组或多组测试。 此外,在每个子任务中,至少有一半得分的测试组中 $n$ 为奇数。

子任务 额外限制 分值
1 $q = 0, n \le 10$ 8
2 $q = 0, n \le 200$ 10
3 $q = 0, n \le 2000$ 18
4 $q = 0$ 30
5 总是 $z = B$(集合 $A$ 不变) 16
6 无额外限制 18

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.