CF1721F Matching Reduction
题目描述
给定一个二分图,第一部分有 $n_1$ 个顶点,第二部分有 $n_2$ 个顶点,共有 $m$ 条边。该图的最大匹配是指选取尽可能多的边,使得没有任何一个顶点被多于一条选中的边连接。
你需要对该图处理两种类型的查询:
- $1$ —— 删除尽可能少的顶点,使得最大匹配的大小恰好减少 $1$,并输出你删除的顶点。然后,找到该图的任意一个最大匹配,并输出该匹配中所有边的编号之和;
- $2$ —— 这种类型的查询只会在一次 $1$ 型查询之后出现。对于该查询,你需要输出上一次查询中你选择的最大匹配所包含的边。
注意,你需要以在线模式解决本题。也就是说,你不能一次性读入全部输入。你只能在输出上一个查询的答案后,才能读取下一个查询。请在每次输出后使用 C++ 的 fflush 或 Java 的 BufferedWriter.flush 来刷新输出缓冲区。
输入格式
第一行包含四个整数 $n_1$、$n_2$、$m$ 和 $q$($1 \le n_1, n_2 \le 2 \times 10^5$;$1 \le m \le \min(n_1 \times n_2, 2 \times 10^5)$;$1 \le q \le 2 \times 10^5$)。
接下来 $m$ 行,每行包含两个整数 $x_i$ 和 $y_i$($1 \le x_i \le n_1$;$1 \le y_i \le n_2$),表示第 $i$ 条边连接第一部分的顶点 $x_i$ 和第二部分的顶点 $y_i$。不存在重复的边。
接下来 $q$ 行,每行包含一个整数 $1$ 或 $2$,表示第 $i$ 个查询。关于查询的额外约束如下:
- 类型为 $1$ 的查询次数不会超过初始图的最大匹配大小;
- 类型为 $2$ 的查询次数不会超过 $3$;
- 每个类型为 $2$ 的查询前面必定有一个类型为 $1$ 的查询;
- 你的程序只能在输出第 $(i-1)$ 个查询的答案并刷新输出后,才能读取第 $i$ 个查询。
输出格式
对于类型为 $1$ 的查询,输出三行:
- 第一行输出你删除的顶点数;
- 第二行输出你删除的顶点编号:如果删除的是左部的顶点 $x$,输出 $x$;如果删除的是右部的顶点 $y$,输出 $-y$(负号表示右部顶点);
- 第三行输出在当前图中某个最大匹配的所有边的编号之和。边的编号为 $1$ 到 $m$。
对于类型为 $2$ 的查询,输出两行:
- 第一行输出最大匹配的大小;
- 第二行输出该最大匹配中所有边的编号。注意,这些编号之和应等于你在上一次类型为 $1$ 的查询中输出的数字。
每次输出答案后,别忘了刷新输出缓冲区。
说明/提示
在本题中,你可能会收到“Idleness Limit Exceeded” 的判定,因为本题为在线模式。如果出现这种情况,说明你的输出格式有误,或者没有满足题目的某些约束。你可以将其视为“答案错误”。
为方便起见,示例中的不同查询输出之间用了一行 === 分隔。你的程序中不要输出这行,这只是为了让题面更易于区分各个查询的答案。
由 ChatGPT 4.1 翻译