かしのブログ

競技プログラミングとか

日立製作所 社会システム事業部 プログラミングコンテスト2020 C - ThREE

問題

与えられた N頂点の木の頂点1から頂点 Nに、次の条件を満たすように1から Nの順列 p_iの番号をつける。

任意の頂点の組 (i, j)で、頂点 iと頂点 jの距離が3なら、 p_i +p_j  p_i \times p_j が3の倍数になる。

atcoder.jp

考察

 q_i = p_i \% 3を表す。  (q_i, q_j) = (0, n), (n, 0)なら、積が3の倍数になる。 (q_i, q_j) = (1, 2), (2, 1), (0, 0)なら、和が3の倍数になる。それ以外のペア (q_i, q_j) = (1, 1), (2, 2)で和や積が3の倍数になるペアは作れない。

与えられた木を二部グラフと捉えると、距離が3の2つの頂点はそれぞれ異なる頂点集合に属する。この異なる頂点集合から任意の頂点のペアを取り出したときに、 (q_i, q_j) = (1, 1), (2, 2)とならないようにすればよい。具体的には、 q_i = 1なる点はすべて同じ集合に、 q_i = 2なる点もすべて同じ集合に、入れれば良い。

実装

atcoder.jp