P12095 [NERC2024] DAG Serialization

题目描述

考虑一个简单的单比特布尔寄存器,它支持两个操作: - $\textbf{set}$ —— 如果寄存器是 $\textbf{false}$,则将其设置为 $\textbf{true}$,并返回 $\textbf{true}$;否则,返回 $\textbf{false}$; - $\textbf{unset}$ —— 如果寄存器是 $\textbf{true}$,则将其设置为 $\textbf{false}$,并返回 $\textbf{true}$;否则,返回 $\textbf{false}$。 寄存器的初始状态为 $\textbf{false}$。假设有 $n$ 个操作 $op_i$($1 \le i \le n$),并且 **至多有两个操作返回 true**。同时,我们给出了操作的部分顺序,表示为一个有向无环图(DAG):边 $i \rightarrow j$ 表示 $op_i$ 在 $op_j$ 之前发生。你的任务是判断是否可能将这些操作排列成某个线性顺序,使得符合给定的部分顺序,并且如果按照该顺序执行操作,得到的结果与给定的一致。

输入格式

第一行,给定一个整数 $n$ —— 操作的数量($1 \le n \le 10^5$)。接下来的 $n$ 行,每行给出一个操作,格式为 $\textit{type} \textit{result}$,其中 $\textit{type}$ 是 `set` 或 `unset`,$\textit{result}$ 是 `true` 或 `false`。保证最多有两个操作的结果为 `true`。 接下来的一个整数 $m$,表示有向无环图中的边数($0 \le m \le 10^5$)。接下来的 $m$ 行,每行给出一对整数 $a$ 和 $b$($1 \le a, b \le n$,$a \neq b$),表示边 $a \rightarrow b$,即操作 $op_a$ 在操作 $op_b$ 之前发生。

输出格式

如果存在一个线性顺序,满足有向无环图约束,并且能够使得操作的结果与给定的相符,输出任何一个满足条件的线性顺序。如果不存在这样的顺序,输出 $-1$。