308323: CF1499G. Graph Coloring

Memory Limit:1024 MB Time Limit:7 S
Judge Style:Text Compare Creator:
Submit:0 Solved:0

Description

Graph Coloring

题意翻译

有一个二分图,一边有 $n_1$ 个顶点,另一边有 $n_2$ 个顶点。中间有 $m$ 条边,编号从 $1$ 到 $m$。需要给每条边涂上红蓝两色之一,使 $\sum\limits_{v\in V}|r(v)-b(v)|$ 的值最小,其中 $V$ 表示顶点集, $r(v)$ 和 $b(v)$ 分别表示与顶点 $v$ 相连的红边和蓝边的数量。 你要处理的是 $q$ 个询问: - $1\ v_1\ v_2$:表示在第一部分的 $v_1$ 号顶点和第二部分的 $v_2$ 号顶点之间连一条边,然后输出此时图的最优化涂色方案的哈希值(定义见下)。有多解的话输出任意一个即可。 - $2$:对于上一个询问 $1$,输出你给出的哈希值所对应的染色方案。若哈希值对应多种方案则输出任意一种。保证上一个询问是询问 $1$,且询问 $2$ 的次数不超过 $10$ 个。 一种涂色方案的哈希值定义为 $(\sum\limits_{i\in R}2^i)\bmod{998244353}$,其中 $R$ 是所有涂红色的边的编号集合。 输入强制在线。

题目描述

You are given a bipartite graph consisting of $ n_1 $ vertices in the first part, $ n_2 $ vertices in the second part, and $ m $ edges, numbered from $ 1 $ to $ m $ . You have to color each edge into one of two colors, red and blue. You have to minimize the following value: $ \sum \limits_{v \in V} |r(v) - b(v)| $ , where $ V $ is the set of vertices of the graph, $ r(v) $ is the number of red edges incident to $ v $ , and $ b(v) $ is the number of blue edges incident to $ v $ . Sounds classical and easy, right? Well, you have to process $ q $ queries of the following format: - $ 1 $ $ v_1 $ $ v_2 $ — add a new edge connecting the vertex $ v_1 $ of the first part with the vertex $ v_2 $ of the second part. This edge gets a new index as follows: the first added edge gets the index $ m + 1 $ , the second — $ m + 2 $ , and so on. After adding the edge, you have to print the hash of the current optimal coloring (if there are multiple optimal colorings, print the hash of any of them). Actually, this hash won't be verified, you may print any number as the answer to this query, but you may be asked to produce the coloring having this hash; - $ 2 $ — print the optimal coloring of the graph with the same hash you printed while processing the previous query. The query of this type will only be asked after a query of type $ 1 $ , and there will be at most $ 10 $ queries of this type. If there are multiple optimal colorings corresponding to this hash, print any of them. Note that if an edge was red or blue in some coloring, it may change its color in next colorings. The hash of the coloring is calculated as follows: let $ R $ be the set of indices of red edges, then the hash is $ (\sum \limits_{i \in R} 2^i) \bmod 998244353 $ . Note that you should solve the problem in online mode. It means that you can't read the whole input at once. You can read each query only after writing the answer for the last query. Use functions fflush in C++ and BufferedWriter.flush in Java languages after each writing in your program.

输入输出格式

输入格式


The first line contains three integers $ n_1 $ , $ n_2 $ and $ m $ ( $ 1 \le n_1, n_2, m \le 2 \cdot 10^5 $ ). Then $ m $ lines follow, the $ i $ -th of them contains two integers $ x_i $ and $ y_i $ ( $ 1 \le x_i \le n_1 $ ; $ 1 \le y_i \le n_2 $ ) meaning that the $ i $ -th edge connects the vertex $ x_i $ from the first part and the vertex $ y_i $ from the second part. The next line contains one integer $ q $ ( $ 1 \le q \le 2 \cdot 10^5 $ ) — the number of queries you have to process. The next $ q $ lines contain the queries in the format introduced in the statement. Additional constraints on the input: - at any moment, the graph won't contain any multiple edges; - the queries of type $ 2 $ are only asked if the previous query had type $ 1 $ ; - there are at most $ 10 $ queries of type $ 2 $ .

输出格式


To answer a query of type $ 1 $ , print one integer — the hash of the optimal coloring. To answer a query of type $ 2 $ , print one line. It should begin with the integer $ k $ — the number of red edges. Then, $ k $ distinct integer should follow — the indices of red edges in your coloring, in any order. Each index should correspond to an existing edge, and the hash of the coloring you produce should be equal to the hash you printed as the answer to the previous query. If there are multiple answers to a query, you may print any of them.

输入输出样例

输入样例 #1

3 4 2
1 2
3 4
10
1 1 3
1 2 3
2
1 3 3
2
1 2 4
2
1 2 1
1 1 1
2

输出样例 #1

8
8
1 3
40
2 3 5
104
3 5 6 3
104
360
4 5 6 3 8

Input

题意翻译

有一个二分图,一边有 $n_1$ 个顶点,另一边有 $n_2$ 个顶点。中间有 $m$ 条边,编号从 $1$ 到 $m$。需要给每条边涂上红蓝两色之一,使 $\sum\limits_{v\in V}|r(v)-b(v)|$ 的值最小,其中 $V$ 表示顶点集, $r(v)$ 和 $b(v)$ 分别表示与顶点 $v$ 相连的红边和蓝边的数量。 你要处理的是 $q$ 个询问: - $1\ v_1\ v_2$:表示在第一部分的 $v_1$ 号顶点和第二部分的 $v_2$ 号顶点之间连一条边,然后输出此时图的最优化涂色方案的哈希值(定义见下)。有多解的话输出任意一个即可。 - $2$:对于上一个询问 $1$,输出你给出的哈希值所对应的染色方案。若哈希值对应多种方案则输出任意一种。保证上一个询问是询问 $1$,且询问 $2$ 的次数不超过 $10$ 个。 一种涂色方案的哈希值定义为 $(\sum\limits_{i\in R}2^i)\bmod{998244353}$,其中 $R$ 是所有涂红色的边的编号集合。 输入强制在线。

加入题单

上一题 下一题 算法标签: