AtCoder Regular Contest 116のきろく
AtCoder Regular Contest 116でレート微増しました
- A - Odd vs Even (300点)
- B - Products of Min-Max (400点)
- C - Multiple Sequences (500点)
- D - I Wanna Win The Game (600点)
- E - Spread of Information (800点、実行時間制限: 3 sec): 未提出
- F - Deque Game (800点): 未提出
- 結果、感想
A - Odd vs Even (300点)
の素因数 の重複度(-進付値)を とし、 の約数で -進付値が であるような数の集合を とします。このとき について であり、 について です。
これらより の正の奇数の約数の個数は であり、正の偶数の約数の個数は であるので、 のときは正の奇数の約数の方が多く、 のときは両者の数は等しく、 のときは正の偶数の約数の方が多くなります。
B - Products of Min-Max (400点)
をソートすると の値は選んだ最大のインデックスと最小のインデックスで決まることになります。
最大のインデックスが 最小のインデックスが である選び方について考えます。このとき より です。 のときはこのような選び方は 通りです。 のとき であり、このような選び方は の 個のインデックスをそれぞれ選ぶかどうかの 通りであるので、答えは となります。
括弧の中の については であるので累積和のような要領で 求めていくことができ、全体で で解くことができます。
公式解説 では上記の最大と最小を逆にした考えで答えを求めているようです。
C - Multiple Sequences (500点)
最初は の値で場合分けをしようとして時間を食ってしまいました。左側から倍数を考えていくのは数が多く、かつ という条件を満たすと考えるのは非常に困難です。
今回は重複組み合わせ を用います。これは 種類のものから重複を許して 個を選ぶ組み合わせの数で高校の数学Aでやるように となります。丸と仕切りを並べるやつです。
の値を固定したとき の選び方についてみていきます。 の各素因数 について重複度を とすると の素因数 の重複度は 以上 以下の広義単調増加整数列となります。よって での素因数 の重複度との差を とすると重複度が増える箇所を 箇所の中から重複を許して 箇所選んだ時の場合の数となり(重複するときその箇所で 以上増加)、その場合の数は となります。これは各素因数ごとに独立です。よって、整数 について素因数 の重複度を とすると 答えは となります。素因数も重複度も高々 であるので、組み合わせが高速に求まるように前計算しておくことで で求めることができます。
また の部分は次の2通りの考え方で高速化することができます。
0個目を考える
便宜上 というものを最初に追加することで 重複度が増える箇所を 箇所の中から重複を許して 箇所選んだ時の場合の数に帰着することができるので となります。
D - I Wanna Win The Game (600点)
3つ目の条件 と1つ目の条件 より二進法での桁DPを考えます。2つ目の条件 より各 の桁数は の桁数以下であるので*1、 桁だけ考えればいいことが分かります。 なので ですね。また、3つ目の条件より各桁について のその桁が となるような は偶数個でなければならないことが分かります。
$$ {\mathrm{dp}}_{i,j} = (\text{下から \(i\) 桁を 3 つ目の条件を満たすように決めたときの和が \(j\) となる場合の数}) $$ とし、このとき
であり、 について$$ {\mathrm{dp}}_{i,j} = \sum_{k=0}^{\min\left\{ \left\lfloor \frac{N}{2} \right\rfloor ,\, \left\lfloor \frac{j}{2^i} \right\rfloor\right\}} {}_N \mathrm{C}_{2K}\, {\mathrm{dp}}_{i,j - 2k 2^{i-1}} = \sum_{k=0}^{\min\left\{ \left\lfloor \frac{N}{2} \right\rfloor ,\, \left\lfloor \frac{j}{2^i} \right\rfloor\right\}} {}_N \mathrm{C}_{2K}\, {\mathrm{dp}}_{i,j - 2^i k} $$ となります。 総和の上限が少し複雑ですが、これは「配るDP」で書くことによって上限について考えずにコードを組むことができます。E - Spread of Information (800点、実行時間制限: 3 sec): 未提出
グラフは木となるので葉から...みたいに考えましたが分かりませんでした...
F - Deque Game (800点): 未提出
ゲーム問題苦手...
結果、感想
C問題で前計算の数が少なすぎて3WA出してしまい、それに思い至るまでに時間を食ってしまいました... D問題でも上の桁から考えていたのでそれで考えが少し複雑になってしまい、バグ取りに時間がとられてしまいました。もっと早く通せていれば黄色パフォだったかも...
*1:3つ目の条件より「以下」の部分は「未満」、すなわち同じになることがないことは分かりますが別にそこまで考える必要はないです
AtCoder Beginner Contest 197のきろく
AtCoder Beginner Contest 197(Sponsored by Panasonic)に参加。微増しましたがHighest更新ではありませんでした。
- A - Rotate (100点)
- B - Visibility (200点)
- C - ORXOR (300点)
- D - Opposite (400点)
- E - Traveler (500点)
- F - Construct a Palindrome (600点、実行時間制限: 3 sec)
- 結果、感想
A - Rotate (100点)
std::rotate
やstd::string.substr
を使ってもできますが、今回は3文字固定なのでS[1]
, S[2]
, S[0]
の順に出力すればいいです。
B - Visibility (200点)
マス から4方向それぞれへ範囲外に出る、もしくは障害物がにぶつかるまで数えながら進んでいけばいいです。実装方法によってはスタートマスの重複カウントに注意。
C - ORXOR (300点)
区間の分け方は最後を除くどの要素の後で区切るかの 通りでこれをbit全探索していくことで答えを出すことができます。
答えの初期値を にしていたのですが、この問題では最大 になりうるので、1WA出してしまいました...
またこの問題はDFSでも答えを出すことができ、こっちの場合は関数の返り値を答えにすればいいので、初期値に悩まされる心配はありません。
D - Opposite (400点)
が偶数であり、 と の中点が正 角形の対称中心*1になり、この点を とします。この正 角形の頂点は点 を中心とする円の演習を 等分する 点であり、 は反時計回りに並んでいるので、 は を点 中心で反時計回りに 回転させたものであるので、点 の座標を計算することができます。
を始点中点で反時計周りに角度 だけ回転させるとき、 となる実数 を用いると回転後のベクトルは となります(途中式は加法定理を用いて計算)。これを直接計算さてもいいですし、回転は一次変換であることから回転行列 を用いた行列積でも求まりますし、Gauß平面上の回転は複素数の積であることから でも計算することができます。
また、別解として は ( が直径より円周角) (これも円周角) の三角形であることから は を点 中心で反時計回りに 回転させたものを 倍したものになる、という解法があります。
E - Traveler (500点)
回収するボールの色を表す整数が広義単調増加でなければならないので色の回収順は固定されています。
色が であるようなボール(のインデックス)の集合を とすると色 を回収しているときに と の両方を訪れる必要があり、その一方を訪れたのちもう一方へ向かう途中に色 であるようなボールを全て回収することができます。同じ色の改修中に両端点を複数回訪れることに意味はないため、どちらの端点を先に訪れるかを決めたときこのような回収方法が最適手の1つとなります。
さて各色ごとにどちら向きに進むのが最善かを判断することになりますが、これは前の色をどちら向きで回収するかによって最後の位置が決まるのでそれを基にDPで求めることができます。
色について座標圧縮しておいて 番目に小さい色を とし、この色の個数を とします。ただし、最初と最後には座標 にいなければならないため、便宜上 と存在しない色を追加し、この色のボールが座標 にあるものとします。また、 とします。
$$ {\mathrm{dp}}_{i,j} = (\text{色 \(k_i\) のボールを (\(j=0\) ? 右 : 左) 向きにとる時の最後までの最小移動距離}) $$ としたとき $$ {\mathrm{dp}}_{0,0} = {\mathrm{dp}}_{0,1} = 0 $$ であり、 について
$$
{\mathrm{dp}}_{i,0} = \min\left\{{\mathrm{dp}}_{i-1,0} + \left|\max_{i \in S_{k_{i-1}}} X_i - \min_{i \in S_{k_i}} X_i \right|,\,{\mathrm{dp}}_{i-1,1} + \left|\min_{i \in S_{k_{i-1}}} X_i - \min_{i \in S_{k_i}} X_i \right| \right\} + d_i
$$ $$
{\mathrm{dp}}_{i,1} = \min\left\{{\mathrm{dp}}_{i-1,0} + \left|\max_{i \in S_{k_{i-1}}} X_i - \max_{i \in S_{k_i}} X_i \right|,\,{\mathrm{dp}}_{i-1,1} + \left|\min_{i \in S_{k_{i-1}}} X_i - \max_{i \in S_{k_i}} X_i \right| \right\} + d_i
$$
という漸化式が成り立ち、答えは となります。
F - Construct a Palindrome (600点、実行時間制限: 3 sec)
回文ができる時、「 と で同じ文字列のパスが存在するような頂点 が存在する」、または「 と で同じ文字列のパスが存在するような隣接頂点組 が存在する」が成立します。始点である頂点 と終点である頂点 から同時に同じ文字が書かれている辺を辿って同じ頂点もしくは隣接頂点に到達するかどうかを調べればいい、という所まではコンテスト中に考察できましたが、そこから何も進めませんでした。
次のようなグラフを考えます。 頂点で、各頂点は元のグラフの2頂点の組に対応する(2つが同じ頂点でもよい)、ここで に対応する頂点を と表記します。辺については元のグラフで の辺と の辺で同じ文字が書かれている辺が存在する場合 と の間に無向辺を張ります。
このグラフにおいて元の「 と で同じ文字列のパスが存在するような頂点 が存在する」ことは から への経路が存在し、その距離の2倍が回文の長さになります。
また、「 と で同じ文字列のパスが存在するような隣接頂点組 が存在する」については から への経路が存在し、その距離の2倍 + 1 が回文の長さになります。
よって から各頂点への最短距離を求めることで答えを導くことができます。この最短距離はBFSで求めることができます。
結果、感想
レートはギリギリ暖まりました。もっとCやDを早く通せていればパフォーマンス1800行ってかもしれないと思うともっと精進しなければと思います。
*1:外心でもある
Codeforces Round #710 (Div. 3)のきろく
青に復帰しました。問題文和訳はこちら
- A. Strange Table / Странная таблица
- B. Partial Replacement / Частичная замена
- C. Double-ended Strings / Двусторонние строки
- D. Epic Transformation / Эпическая трансформация
- E. Restoring the Permutation / Восстановление перестановки
- F. Triangular Paths / Треугольные пути
- G. Maximize the Remaining String / Максимизируй оставшуюся строку
- 結果、感想
A. Strange Table / Странная таблица
行 列 ( は0オリジン) の"by columns"での数値は であるので、 より が求まります。
行 列の"by rows"での数値は となるのでこれに代入して答えが求まります。
B. Partial Replacement / Частичная замена
条件を満たしつつできるだけ置き換える'*
'を離した時が最適解です。'*
'の位置を配列等で記憶しておいてstd::upper_bound
などの二分探索系の関数を用いたり、実際に探していくことで求めることができます。
C. Double-ended Strings / Двусторонние строки
制約が小さいので 両方の開始位置と作る文字列の長さを全探索することができます。長さに関しては尺取り法によって高速化できます。
長さが のとき操作回数は となります。よって最大の長さを探せばいいです。
D. Epic Transformation / Эпическая трансформация
制約が小さいので毎回最多2つを減らしていくという貪欲法で通すことはできます。しかし、次のようにも求められます。
一番多いのが過半数の場合
一番多いのとそれ以外のものをペアにして消していくことができ、その個数を とすると を達成することができます。それ以外の消し方ではこの数を達成することができません。
そうでない場合
が奇数の時はどうしても1つ残りますが、毎回最多2つを減らしていくことで全てのペアを消すことができます。
この時 を で割った余りだけ残ります。
E. Restoring the Permutation / Восстановление перестановки
左から順に答えを作っていきます。辞書順最小のものを 最大のものを とします。
または のときは となります。
そうでないとき、 についてはこれまで に選ばれていない数のなかで最小のものが になります。 についてはこれまで に選ばれてない数のうち 未満で最大のものが です。
F. Triangular Paths / Треугольные пути
三角形内において上から下へしか動くことができないので の小さい順に訪れまるのでそのようにソートしておきます。
について と座標変換します。変換後の座標においては が偶数の時は右、つまり への辺が活性化していて、奇数の時は上、つまり への辺が活性化しています。
さて、 から へ行くときのコストはどうなるでしょうか? それぞれの変換後の座標を とします。このとき問題文中の経路が必ず存在するという制約から であることが分かります。
$ \displaystyle \left\lfloor \frac{x_i}{2} \right\rfloor \lt \left\lfloor \frac{x_{i+1}}{2} \right\rfloor $ のとき
が奇数の時 座標が になるまで上に上がり、そこから右に行くことでコスト で行くことができます。
$ x_i = x_{i+1} $ で偶数のとき
ずっと上に行くことでコスト で行くことができます。
その他のとき
活性辺のみを辿って目的地に着くことができます。つまり、コスト である。
よってこれらのコストを合計することで答えを出すことができます。
G. Maximize the Remaining String / Максимизируй оставшуюся строку
本番では解けませんでした...
答えとなる文字列の長さは 内の文字の種類数となります。
この文字列について左から順にそこの場所を占めてもいい最大の文字で埋めていきます。
ある文字 がその場所を占めてもいいかは、それよりも右にそれまで出てきていない文字のみを寄せるかどうかの判別で行うことができます。
結果、感想
F問題も通せれば全完だったのに...とは思いますが、何とか青色に復帰できてよかったなぁっていう感じです。地味にHighestも更新。
Codeforces Round #710 (Div. 3) 問題文和訳
- A. Strange Table / Странная таблица
- B. Partial Replacement / Частичная замена
- C. Double-ended Strings / Двусторонние строки
- D. Epic Transformation / Эпическая трансформация
- E. Restoring the Permutation / Восстановление перестановки
- F. Triangular Paths / Треугольные пути
- G. Maximize the Remaining String / Максимизируй оставшуюся строку
A. Strange Table / Странная таблица
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- セルは1から順に数が振られる
- セルは列ごとに左の列から右の列へと数が振られ、各列内では上から下へ向かって数が振られる
- 各セルの番号は前のセルよりも1大きい整数である
例えば、 の場合、表は次のように数が振られます。
$$
\begin{matrix}
1 & 4 & 7 & 10 & 13 \\
2 & 5 & 8 & 11 & 14 \\
3 & 6 & 9 & 12 & 15 \\
\end{matrix}
$$
しかし、Поликарпはこのような番号付けは不便であると考えています。彼は「行による」番号付けを好みます。
- セルは1から順に数が振られる
- セルは行ごとに上の行から下の列へと数が振られ、各列内では左から右へ向かって数が振られる
- 各セルの番号は前のセルよりも1大きい整数である
例えば、 の場合、Поликарпは次のような表の番号付けを好みます。
$$
\begin{matrix}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & 8 & 9 & 10 \\
11 & 12 & 13 & 14 & 15 \\
\end{matrix}
$$
Поликарпにはあまり時間がないため、「列による」番号付けで であるようなセルの「行による」番号付けでの番号が何になるかを調べるよう頼まれています。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースは単一行で構成され、3つの整数 が与えられる、ここで、 は行数と列数であり、 はセルの番号である。
数値が -bit整数型に収まらないテストケースが存在するため、プログラミング言語の -bit以上の整数型を用いる必要があることに注意せよ。
出力
各テストケースについて、「列による」番号付けでのセルの番号を出力せよ。
入出力例
5 1 1 1 2 2 3 3 5 11 100 100 7312 1000000 1000000 1000000000000
1 2 9 1174 1000000000000
B. Partial Replacement / Частичная замена
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
.
'と'*
'から成る 文字の文字列 が与えられます。以下の条件を満たすようにいくつかの'*
'文字を'x
'文字に置換したいと思っています。
- 元の文字列の最初の'
*
'文字は'x
'に置換されてなければならない - 元の文字列の最後の'
*
'文字は'x
'に置換されてなければならない - 置換された隣り合う2つの文字'
x
'間の距離は を超えてはならない(より形式的には、位置 と で置換を行い、位置 に記号'x
'が存在しない場合、 は 以下でなければならない)
例えば、 .**.***
の場合、以下の文字列は上記の条件を満たしています。
.xx.*xx
.x*.x*x
.xx.xxx
しかし、例えば、以下の文字列は条件を満たしません。
.**.*xx
(最初の'*
'文字は'x
'に置換されてなければならない).x*.xx*
(最後の'*
'文字は'x
'に置換されてなければならない).x*.*xx
(位置 と 間の距離は よりも大きい)
が与えられたとき、上記を条件を満たすために'x
'に置換しなければならない'*
'文字の最小数を求めてください。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には2つの整数 が与えられる。
各テストケースの2行目には文字'.
'と'*
'から成る 文字の文字列 が与えられる。
文字列 には少なくとも1つの'*
'が存在することは保証される。
任意の隣り合う2つの'*
'文字の間の距離が を超えないことは保証される。
出力
各テストケースについて上記を条件を満たすために'x
'に置換しなければならない'*
'文字の最小数を出力せよ。
入出力例
5 7 3 .**.*** 5 1 ..*.. 5 2 *.*.* 3 2 *.* 1 1 *
3 1 3 2 1
C. Double-ended Strings / Двусторонние строки
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- の(文字列 の長さが0より大きい)とき、文字列 の最初の文字を削除する、つまり、 を に置換する
- のとき、文字列 の最後の文字を削除する、つまり、 を に置換する
- の(文字列 の長さが0より大きい)とき、文字列 の最初の文字を削除する、つまり、 を に置換する
- のとき、文字列 の最後の文字を削除する、つまり、 を に置換する
それぞれの操作の後、文字列 または が空になることがあることに注意して下さい。
例えば、 "hello
" "icpc
"の場合、次のような一連の操作を行うことができます。
- 文字列 の最初の文字を削除 "
ello
" "icpc
" - 文字列 の最初の文字を削除 "
ello
" "cpc
" - 文字列 の最初の文字を削除 "
ello
" "pc
" - 文字列 の最後の文字を削除 "
ell
" "pc
" - 文字列 の最後の文字を削除 "
ell
" "p
"
与えられた文字列 について、文字列 を等しくするための最小の操作回数を求めてください。空文字列同士も等しいものとすることに注意して下さい。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には小文字のラテン文字から成る文字列 が与えられる。
各テストケースの2行目には小文字のラテン文字から成る文字列 が与えられる。
出力
各テストケースについて、文字列 を等しくするための最小の操作回数を出力せよ。
入出力例
5 a a abcd bc hello codeforces hello helo dhjakjsnasjhfksafasd adjsnasjhfksvdafdser
0 2 13 3 20
D. Epic Transformation / Эпическая трансформация
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- 配列内の異なる2数 を選ぶ
- 配列から 番目と 番目の要素を削除する
例えば、 の場合、次のような一連の操作を行うことができます。
- を選び、配列 は になる
- を選び、配列 は になる
配列に一連の操作を施した後の配列のサイズの最小値はどうなるでしょうか?
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には単一の整数 が与えられる、これは配列 の長さである。
各テストケースの2行目には 個の整数 が与えられる。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて、配列に一連の操作を施した後の、サイズの可能な最小値を出力せよ。
入出力例
5 6 1 6 1 1 4 4 2 1 2 2 1 1 5 4 5 4 5 4 6 2 3 2 1 3 1
0 0 2 1 0
E. Restoring the Permutation / Восстановление перестановки
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
Поликарпは から までの数の順列 を貰いました。しかし、Поликарпが家に帰ったとき、ポケットの中の順列 が以下のルールに従っ配列 に変わっていることに気が付きました。
ここで、Поликарпは与えられた順列としてあり得る辞書順最小の配列と辞書順最大の配列がどんなものか疑問に思いました。
長さ の配列 が長さ の配列 よりも辞書順で小さいとは配列 と の最初の 個の要素が一致し、配列 の 番目の要素が配列 の 番目の要素より小さい場合です。例えば、配列 は配列 よりも辞書順で小さいです。
例えば、 の場合、 となり、この場合、元の としては次のような順列が考えられます。
- (辞書順最小順列)
- (辞書順最大順列)
与えられた配列 についてПоликарпに最初に渡された可能性のある辞書順最小の順列と辞書的最大の順列を求めて下さい。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には単一の整数 が与えられる。
各テストケースの2行目には 個の整数 が与えられる。
配列 がある順列 に問題文中のルールを適用して得られたものであることは保証されている。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて、2行を出力せよ。
- 1行目に 個の整数を出力せよ、これらはПоликарпに最初に渡された可能性のある辞書順最小の順列である
- 2行目に 個の整数を出力せよ、これらはПоликарпに最初に渡された可能性のある辞書順最大の順列である
入出力例
4 7 3 3 4 4 7 7 7 4 1 2 3 4 7 3 4 5 5 5 7 7 1 1
3 1 4 2 7 5 6 3 2 4 1 7 6 5 1 2 3 4 1 2 3 4 3 4 5 1 2 7 6 3 4 5 2 1 7 6 1 1
F. Triangular Paths / Треугольные пути
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
活性辺のみから成る経路が存在する場合、点 から点 へ行くことができます。例えば、上図で、 から への経路は存在しますが、 から への経路は存在しません。
最初は点 にいます。各ターン次のことが行えます。
- 点 空の辺を取り換える。点 への辺が活性化されていれば、それの代わりに点 への辺が活性化され、そうではなく点 への辺が活性化されていれば、それの代わりに点 への辺が活性化される。この行動は経路のコストを 増加させる
- 活性辺を辿って現在の点から次の点へ移動する。この行動は経路のコストを増加させない
無限三角形上の 点 が与えられます。 から任意の順序で 個の点を全て通過する最小コストの経路を求めてください。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースは単一の整数 が与えられる行で始まる、これは訪れる点の個数である。
各テストケースの2行目には 個の整数 が与えられる、ここで は 番目の点が位置する層の番号である。
各テストケースの2行目には 個の整数 が与えられる、ここで は 層目内の 番目の点の番号である。
全ての 点が異なることは保証されている。
全ての 点を横断する方法が常に少なくとも1通り存在することは保証されている。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて、対応するテストケースの全ての点を通過する経路の最小コストを出力せよ。
入出力例
4 3 1 4 2 1 3 1 2 2 4 2 3 2 1 1000000000 1 1000000000 4 3 10 5 8 2 5 2 4
0 1 999999999 2
G. Maximize the Remaining String / Максимизируй оставшуюся строку
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- 文字列 の中で位置 の文字が少なくとも2回出現するようなインデックス を選び、位置 の文字を削除する、即ち、 を に置換する
例えば、 "codeforces
"の場合、次のような一連の操作を行うことができます。
- "
codefrces
" - "
odefrces
" - "
odefrcs
"
文字列 が与えられたとき、その文字列のすべての文字がユニーク*2になるような一連の操作を行った後に得られる、辞書順最大の文字列を求めて下さい。
長さ の文字列 が長さ の文字列 よりも辞書順で小さいのは、以下の場合です。
- 文字列 と の最初の 文字が同じで、文字列 の 文字目が文字列 の 文字目よりも小さいようなインデックス が存在する場合
- または文字列 と の最初の 文字が同じで、 である場合
例えば、文字列 "aezakmi
"は文字列 "aezus
"よりも辞書順で小さいです。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースは、小文字のラテン文字からなる文字列 によって特徴づけられる。
全てのテストケースでの文字列の長さの和が を超えないことは保証されている。
出力
各テストケースについて、文字列の全ての文字がユニークになるような一連の操作を行った後に得られる、辞書順最大の文字列を出力せよ。
入出力例
6 codeforces aezakmi abacaba convexhull swflldjgpaxs myneeocktxpqjpz
odfrces ezakmi cba convexhul wfldjgpaxs myneocktxqjpz
Codeforces Round #709 (Div. 2) 問題文和訳
- A. Prison Break / Побег (500点)
- B. Restore Modulo / Восстановление модуля (1250点)
- C. Basic Diplomacy / Базовая дипломатия (1500点)
- D. Playlist / Плейлист (2000点)
- E. Skyline Photo / Панорама города (2500点)
- F. Useful Edges / Полезные рёбра (2750点)
A. Prison Break / Побег (500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
刑務所は 個のセルに分割される の長方形として表すことができ、各セルが刑務所の独房を、セル間の辺は独房間の壁を、外側の辺は外壁を表しています。Michaelは判決を受ける前に刑務官の友人に頼んでいくつかの壁(独房間の壁および外壁)に(隠れた)穴をあけてもらうことができます。Michaelは、自分がどの独房に入ったとしても刑務所から出られるようにしたいです。しかし一方で、できるだけ壁を壊さないようにしたいと思っています。
どの独房からも外に出る経路ができるように壊さなければならない壁の最小枚数を求めてください。
入力
1行目には単一の整数 が与えられる、これはテストケース数である。
つづく 行のそれぞれには2つの整数 が与えられる、これらは対応するテストケースを表している。
出力
各テストケースについて各行に単一の整数を出力せよ、その数とは問題hwの答えである。
入出力例
2 2 2 1 3
4 3
注記
テストケース例で考えられる逃走計画を以下に示します。壊した壁は灰色で、壊されていない壁は黒で表されています。
B. Restore Modulo / Восстановление модуля (1250点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
この生成器は4つの非負数 を受け取ります。 と は正でなければならず、 は非負で、 については でなければなりません。長さ の配列 が以下のルールに従って生成されます。
- , ここで は を で割った余りを表す
- である全ての について
例えば、 とすると、 となります。
このような配列の価格は、この生成器の の値になります。
Лёшаは疑問に思いました、それぞれの配列についてどれだけの金額を得ることができるのだろうかと。全ての配列について、この配列を生成する4数 が存在するかどうかわかるように手助けしてください。もし存在するならば を最大化してください。
入力
1行目には単一の整数 が与えられる、これは配列の個数である。
配列についての記述の1行目には単一の整数 が与えられる、これはこの配列のサイズである。
配列についての記述の2行目には 個の整数 が与えられる、これらはこの配列の要素である。
全てのテストケースでの配列サイズの和が を超えないことは保証されている。
出力
全ての配列について以下のものを出力せよ。
- この配列を生成するような4数が存在しない場合;
- が任意の大きさになる場合:
- その他の場合 の最大値と適切な
入出力例
6 6 1 9 17 6 14 3 3 4 2 2 3 7 3 4 3 2 2 4 5 0 1000000000 0 1000000000 0 2 1 1
19 8 -1 -1 -1 2000000000 1000000000 0
C. Basic Diplomacy / Базовая дипломатия (1500点)
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
各日に何人かの友人はプレイ可能で、その他の友人はプレイができません。毎日Алексейはプレイ可能な友人のうち1人を選んで、プレイすることを申し出ます(勿論、彼等は常に承諾します)。しかし、彼らのうち誰かが 回より厳密に多く選ばれてしまうと、他の全ての友人は気分を害してしまいます。勿論、Алексейは誰かを怒らせてしまいたくありません。
誰も 回よりも厳密に多い回数選ばれないように、彼がチームメイトを選ぶのを手伝ってください。
入力
各テストは複数のテストケースから成る。1行目にはテストケース数 が与えられる。テストケースについての記述が続く。
各テストケースの1行目にはそれぞれ友人の人数とプレイ日数を表す2つの整数 が与えられる。
つづく 行の 行目には 1つの整数 が与えられ、それに空白区切りの 個の異なる整数 が続く、これらは 日に目にプレイ可能な友人のインデックスである。
全てのテストケースでの の和が(それぞれ) を超えないことは保証されている。全てのテストケースの全ての日での の和が を超えないことは保証されている。
出力
各テストケースについて答えを出力せよ。目標を達成する方法がない場合は"NO
"と出力せよ。
そうでない場合、1行目に"YES
"と出力し、2行目に空白で区切られた 個の整数 を出力せよ。各 は 日目に選ばれた友人を表していなければならない(したがって、 の1つでなければならない)。
どの値も 回よりも多く出現してはいけない。複数の答えが存在する場合、そのいずれかを出力せよ。
入出力例
2 4 6 1 1 2 1 2 3 1 2 3 4 1 2 3 4 2 2 3 1 3 2 2 1 1 1 1
YES 1 2 1 1 2 3 NO
D. Playlist / Плейлист (2000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
各曲には正整数であるジャンル が振られています。Аркадийがジャンル の曲を聴き終え、その前に聴いていた曲のジャンルを とします。 の場合、最後に聴いていた(ジャンル の)曲をプレイリストに削除します。その後、削除された曲をスキップし、前に聴いた曲について忘れて、通常通り曲を聴き続けます。言い換えれば、ある曲を削除した後、すぐに次の曲を削除することはできません。
ここで は整数 の最大公約数(GCD)*5を表します。
例えば、初期状態の曲のジャンルが であったとすると、プレイリストは次のように変換されます: であるため であるため 。太数字は、最後に再生された2つの曲を表しています。曲が削除された後は、Аркадийはその曲と前の曲を聴いたことを忘れてしまうことに注意してください。
初期状態のプレイリストが与えられるので、どの曲が最終的に削除されるか、そして、度の順に削除されるかを判別してください。
入力
各テストは複数のテストケースから成る。1行目にはテストケース数 が与えられる。テストケースについての記述が続く。
各テストケースの1行目には単一の整数 が与えられる、これは曲数である。
各テストケースの2行目には 個の整数 が与えられる、これらは曲のジャンルである。
全てのテストケースでの の和が を超えないことは保証されている。3
出力
各テストケースについて、単一行に出力せよ。まず、単一の整数 を出力せよ、これは削除された曲数である。そのあと、 個の異なる整数を出力せよ、これらは削除された順番で削除された曲を表している。
入出力例
5 5 5 9 2 10 15 6 1 2 4 2 4 2 2 1 2 1 1 1 2
2 2 3 2 2 1 2 2 1 1 1 0
注記
1つ目のテストケースについての説明は問題文中にあります。
2つ目のテストケースではプレイリストは次のように変換されます。 であるため であるため
3つ目のテストケースではプレイリストは次のように変換されます。 であるため (Аркадийは同じ曲を2回続けて聴いた) であるため
4つ目のテストケースでは2曲目を削除した後の3つ目のテストケースと同じです。
5つ目のテストケースでは同じ曲を何度も何度も聴いていますが、 であるため、削除されません。
E. Skyline Photo / Панорама города (2500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
街には 個のビルがあり、 番目のビルの高さは正の値 です。街にある 個の全てのビルの高さは異なります。さらに、それぞれのビルの美しさは です。街には醜い建物もあるので、美しさは正にも負にもなりえることに注意してください。
写真の集合はスカイライン上のビルを撮影した1枚以上の写真から成ります。各写真は連続インデックス区間を形成する1つ以上のスカイライン上のビルが含まれます。各ビルはちょうど1枚の写真に写っていなければなりません。つまり、どの写真にも写っていないビルがあったり、複数の写真に写っているビルが存在する場合、その写真の集合は有効ではないという訳です。
写真の美しさは、写っている最も短いビルの美しさ に等しいです。写真の集合の美しさの合計は、その写真に含まれる全ての写真の美しさの合計です。有効な写真の集合が持つ最大の美しさを求めるAliceの手伝いをしてください。
入力
1行目には単一の整数 が与えられる、これはスカイライン上のビルの数である。
2行目には 個の異なる整数 が与えられる。 番目の数は建物 の高さを表す。
3行目には 個の異なる整数 が与えられる。 番目の数は建物 の美しさを表す。
出力
有効なスカイラインの写真の集合についてAliceが達成できる最大の美しさを表す1つの数値を出力せよ。
入出力例
5 1 2 3 5 4 1 5 3 2 4
15
5 1 4 3 2 5 -3 4 -10 2 7
10
2 2 1 -2 -3
-3
10 4 7 3 2 5 1 9 10 6 8 -4 40 -46 -8 -16 4 -10 41 12 3
96
注記
1つ目の入出力例では、Aliceは5枚の写真を撮り、それぞれに1つのビルを写すことで最大の美しさを得ることができます。
2つ目の入出力例では、Aliceは4枚の写真を撮ることで、最大の美しさ を達成することができます。1つのビルを写したビル の3枚の写真のそれぞれの美しさ で、もう1枚の写真はビル を写し、美しさ です。
3つ目の入出力例では、Aliceは街全体の写真を1枚だけ撮ります。
4つ目の入出力例では、Aliceは最大の美しさを得るために、1つのビルを写したビル の写真と、ビル を写した1枚の写真を撮ります。
F. Useful Edges / Полезные рёбра (2750点)
テストごとのメモリ制限:512 MB
入力: 標準入力
出力: 標準出力
- と がこの経路の端点である
- はこの経路の辺の1つである
- この経路の全ての辺の重さの合計が を超えない
このグラフ上の有用な辺の数を出力してください。
入力
1行目には2つの整数 が与えられる。
つづく 行の各行には3つの整数 が与えられる、これらは と を結ぶ重さ の辺を表す。
次の行には唯一の整数 が与えられる、これは三つ組の個数である。
つづく 行の各行には 三つ組 を表す3つの整数 が与えられる。
次のことは保証されている。
- グラフにはループや多重辺は含まれない
- 三つ組内の全ての組 は異なる
出力
グラフ内の有用な辺の数を表す単一の整数を出力せよ。
入出力例
4 6 1 2 1 2 3 1 3 4 1 1 3 3 2 4 3 1 4 5 1 1 4 4
5
4 2 1 2 10 3 4 10 6 1 2 11 1 3 11 1 4 11 2 3 11 2 4 11 3 4 9
1
3 2 1 2 1 2 3 2 1 1 2 5
2
注記
1つめの入出力例では重み のものを除いてすべての辺が有用です。
2つ目の入出力例では、 と の間の辺は、経路 に属し、 であるため、唯一有用です。一方で、 と の間の辺は、有用ではありません。
3つ目の入出力例では、長さがちょうど の経路 が存在するので、両方の辺が有効です。経路が1つの頂点を2回以上通過することがあることに注意してください。
AtCoder Beginner Contest 196のきろく
AtCoder Beginner Contest 196に参加。レートが1700以上に回復しました。
- A - Difference Max (100点)
- B - Round Down (200点)
- C - Doubled (300点)
- D - Hanjo (400点)
- E - Filters (500点)
- F - Substring 2 (600点、実行時間制限: 3 sec)
- 結果、感想
A - Difference Max (100点)
は について狭義単調増加、 について狭義単調減少であるため、 のとき は最大値をとります。
B - Round Down (200点)
文字列として'.
'が出てくるまで1文字ずつ出力すればOKです。
'.
'が存在しなければ元から整数なのでそのまま出力します。
C - Doubled (300点)
より全探索では間に合いません。ただし、 以下で問題文の条件を満たすものは繰り返し文字列が高々 より、条件を満たすものを小さいものから順に より大きくなるまで個数をカウントすれば答えが出ます。
また、公式解説 にある の解法として、次のように繰り返す整数の数を求める方法が考えられます。
の桁数を とします。
が奇数の時は から までの 個の整数が条件を満たす数を生成します。
が偶数の時は の前半部 と後半部 について、 のとき から までの 通り、 のとき から までの 通りです。
D - Hanjo (400点)
公式解説のように全ての敷き詰め方をDFSで確かめる方法がありますが、少し別の方法を用いました。
重なりやはみ出ることを無視すると長方形の畳の配置方法は各畳の左上の位置とどちら向きに置くかの 通りで、このうち、重なりやはみ出しのないものが条件を満たす敷き詰め方です。ここで各畳の左上の位置の 通りの列挙についてある状態から次の状態へ で遷移できるならば で答えを求めることができます。
集合 の大きさ の部分集合の列挙は蟻本にある通り以下のようにして処理をすることができます。
int bit = (1 << k) - 1; while(bit < (1 << n)){ // 各集合についての処理をここに書く int x = bit & -bit, y = bit + x; bit = (((bit & ~y) / x) >> 1) | y; }
この問題のコードを書くのに少し時間がかかってしまい、EやF問題に避ける時間が少なくなってしまいました。
またこっちの解法では長方形の畳が存在しない のケースがコーナーとなってしまうことに注意しましょう(1敗)。
E - Filters (500点)
途中で がある場合、定義域のうちある値以上については像の上限に、 がある場合は定義域のうちある値以下については像の下限となるため、このような上下限に挟まれる範囲を「有意な範囲」と呼ぶことにします。このとき、函数 についての有意な範囲と像の幅は等しくなります。
とし、 について の像を 有意な範囲を とします。
となるので を求めればいいことが分かります。については恒等写像であるため始域、有意な範囲、像が全て一致し、 となります。
番目まで求まっていたとき、 番目のそれぞれの値を求めましょう。このとき の始域は とみなすことができます。
$ t_i = 1 $ のとき
のため、有意な範囲は変化せず、像は です。よって、 となります。
$ t_i = 2 $ のとき
で、像は となるため となります。また、 の有意な範囲は像と等しくなり、全体の有意な範囲は となります。
$ t_i = 3 $ のとき
で、像は となるため となります。また、 の有意な範囲は像と等しくなり、全体の有意な範囲は となります。
F - Substring 2 (600点、実行時間制限: 3 sec)
コンテスト中には解けませんでした...
文字列ですが整数列して扱います。答えは となります(はXOR演算です)。 を反転させた配列を とすると、 となるので畳み込みのような式になるので、どうにかして積の和に変換できるとAC-Libararyのconvolutionが利用できるので、そのようにできるかを考えます。
はどちらか一方のみが のとき、 となり、そうでない場合 となるので と表すことができます。これで変換できたので、実装することができました。
結果、感想
1700を下回っていたのが、それを1700以上に戻せたので、よかったなと思っていますが、D問題をもっと早く解けたらな、と思いました。
因みにF問題の(1)は少し改善したE問題用のコードを間違えてFに提出した結果です(オイ)。
Educational Codeforces Round 106 問題文和訳
- A. Domino on Windowsill / Домино на подоконнике
- B. Binary Removals / Двоичные удаления
- C. Minimum Grid Path / Минимальный путь на поле
- D. The Number of Pairs / Количество пар
- E. Chaotic Merge / Хаотичное слияние
- F. Diameter Cuts / Разрезы диаметров
- G. Graph Coloring / Раскраска графа
A. Domino on Windowsill / Домино на подоконнике
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
1行目の最初の セルと2行目の最初の セルが白で塗られています。その他のセルは黒で塗られています。
枚の白いドミノ( タイルで、両方のセルが白で着色されている)と 枚の黒いドミノ( タイルで、両方のセルが黒で着色されている)があります。
白いドミノは盤面のその下の2つのセルに他のドミノが置かれておらず、両方のセルが白である場合、盤面に置くことができます。同様に、黒いドミノはその下の2つのセルに他のドミノが置かれておらず、両方のセルが黒である場合、盤面に置くことができます。
ドミノを縦にも横にも置くことができるとすれば、 枚のドミノを全て置くことができるでしょうか?
入力
1行目には単一の整数 が与えられる、これはテストケースの個数である。
各テストケースの1行目には3つの整数 が与えられる。
各テストケースの1行目には2つの整数 が与えられる。
出力
各テストケースについて、 個のドミノを全て盤面に置くことができればYES
と、そうでなければNO
と出力せよ。
各文字について大文字で出力しても小文字で出力してもよい(それゆえ、例えば、文字列yEs
, yes
, Yes
, YES
は全て肯定の答えとして認識される)。
入出力例
5 1 0 1 1 0 1 1 1 0 0 3 0 0 1 3 4 3 1 2 2 5 4 3 3 1
NO YES NO YES YES
注記
1つ目のテストケースでは です。これは の盤面には黒のセル と白のセル があることを表します。白いセルが1つしかないので、白いドミノを置くことができません。
2つ目のテストケースでは同じ大きさ の盤面ですがどちらのセルも白です。 なので 枚のドミノを置くことができます。
3つ目のテストケースでは盤面は ですが、全て黒で塗られている( であるため)ので、白いドミノを置くことができません。
4つ目のテストケースではセル が白で、そのほかのセルは黒です。 枚の白いドミノを位置 と に、 枚の黒いドミノを位置 と に置くことができます。
B. Binary Removals / Двоичные удаления
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
0
'と'1
'のみから成る文字列 が与えられます。 の長さを とします。ある整数 を選び、次のような長さ の数列 を求めて下さい。
- から までの全ての について
位置 の文字は削除され、残りの文字を順序を変えずに連結します。つまり、配列 の位置が隣接してはいけません。
この結果得られる文字列を とします。 から の全ての について であるとき はソートされているといいます。
得られる文字列 がソートされているような配列 は存在するでしょうか?
入力
1行目には単一の整数 が与えられる、これはテストケースの個数である。
その後、 個のテストケースについての記述が続く。
各テストケースについての唯一の行には文字列 が与えられる。各文字は'0
'か'1
'のいずれかである。
出力
各テストケースについて位置 の文字を取り除き、順番を変えずに連結することで、ソートされている文字列が得られるような配列 が存在する場合、"YES
"と出力せよ。
そうでない場合、"NO
"と出力せよ。
各文字について大文字で出力しても小文字で出力してもよい(それゆえ、例えば、文字列yEs
, yes
, Yes
, YES
は全て肯定の答えとして認識される)。
入出力例
5 10101011011 0000 11111 110 1100
YES YES YES YES NO
注記
1つ目のテストケースでは列 を選ぶことができます。"10101011011
"から下線附きの文字を取り除くと文字列"0011111
"ができ、これはソートされています。
2つ目と3つ目のテストケースでは列は既にソートされています。
4つ目のテストケースでは列 を選ぶことができます。 "11
"となり、これはソートされています。
5つ目のテストケースでは がソートされているような列 を選ぶ方法はありません。
C. Minimum Grid Path / Минимальный путь на поле
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
2方向にしか動くことができません。
- 右方向: 水平方向で、 座標が大きくなる方向
- 上方向: 垂直方向で、 座標が大きくなる方向
つまり、経路は次のような構造になっています。
- 最初、右に行くか上に行くかを選択する
- 次に、選択した方向にある正整数の距離だけ進む(距離は独立して選ぶことができる)
- その後、方向を変えて(右から上、もしくは上から右)、このプロセスを繰り返す
方向転換を何度もしたくないので、 回よりも多く方向転換はしません。
結果として、経路は、各線分が正整数の長さを持ち、垂直線分と水平線分が交互に出てくる高々 本の線分から成る から までの折れ線の鎖となります。
全ての経路が等価であるというわけではありません。 個の整数 があり、ここで は 番目の成分のコストを表します。
これらのコストを用いて、経路のコストをその経路の線分の長さとコストの積の和として定義できます、すなわち、経路が 本の線分 から成る場合、経路のコストは (線分は から まで経路の順に番号が振られている)となります。
最小コストの経路を求め、そのコストを出力してください。
入力
1行目には単一の整数 が与えられる、これはテストケースの個数である。
各テストケースの1行目には単一の整数 が与えられる。
各テストケースの2行目には 個の整数 が与えられる、これらは各線分のコストである。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて、高々 本の交互に並ぶ線分から成る から までの経路の可能な最小コストを出力せよ。
入出力例
3 2 13 88 3 2 3 1 5 4 3 2 1 4
202 13 19
注記
1つ目のテストケースでは、 に到達するためには少なくとも1回は曲がらなければならないので経路はちょうど 本の線分から構成されます: 長さ の水平線分と長さ の垂直線分です。経路のコストは となります。
2つ目のテストケースでは、最適経路の1つが 本の線分から構成されています: 長さ の1本目と長さ の2本目、長さ の3本目です。
この経路のコストは です。
3つ目のテストケースでは、最適経路の1つが 本の線分から構成されています: 長さ の1本目と長さ の2本目、長さ の3本目、長さ の4本目です。この経路のコストは です。
D. The Number of Pairs / Количество пар
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
等式 が成り立つような正整数の組 の個数を求めなければなりません。ここで は の最小公倍数で、 は の最大公約数です。
入力
1行目には1つの整数 が与えられる、これはテストケースの個数である。
各テストケースは1行からなり、3つの整数 が与えられる。
出力
各テストケースについて1つの整数を出力せよ、その数とは上記の等式を満たす組 の個数である。
入出力例
4 1 1 3 4 2 6 3 3 7 2 7 25
4 3 0 8
注記
1つ目の入出力例では、正しい組は です。
2つ目の入出力例では、正しい組は です。
E. Chaotic Merge / Хаотичное слияние
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
列 をちょうど 個の0とちょうど 個の1がある順序で構成してる場合、それをマージ列を言います。
マージ は次のルールによって列 から生成されます。
- のとき、 の先頭から文字を削除し、 の末尾に追加する
- のとき、 の先頭から文字を削除し、 の末尾に追加する
となるような位置 がある場合、2つのマージ列 は異なります。
から までの全ての について であるばあい、文字列 をカオスであるといいます。
ある について を、位置 で始まり、位置 で終わる の連続した文字の部分列とします。
を と のカオスなマージを生成する異なるマージ列の数とします。 と の空でない部分文字列のみを考慮することに注意してください。
を計算してください。答えはmodulo で出力してください。
出力
単一の整数を出力せよ、その数は かつ での の和 modulo である。
入出力例
aaa bb
24
code forces
1574
aaaaa aaa
0
justamassivetesttocheck howwellyouhandlemodulooperations
667387032
注記
1つ目の入出力例では次のようになります。
- 組の部分文字列"
a
"と"b
"の組について、それぞれ"01
"と"10
"が有効なマージ列となる - 組の部分文字列"
a
"と"bb
"の組について、それぞれ"101
"が有効なマージ列となる - 組の部分文字列"
aa
"と"b
"の組について、それぞれ"010
"が有効なマージ列となる - 組の部分文字列"
aa
"と"bb
"の組について、それぞれ"0101
"と"1010
"が有効なマージ列となる - 組の部分文字列"
aaa
"と"b
"の組について、それぞれ有効なマージ列はない - 組の部分文字列"
aaa
"と"bb
"の組について、それぞれ"01010
"が有効なマージ列となる
従って、答えは となる。
F. Diameter Cuts / Разрезы диаметров
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
ある頂点組間の単純経路(各頂点が高々1回しか現れない経路)の長さは、その経路の辺の数です。木の直径はその木の全ての頂点組間の単純経路の最大長です。
木から辺を1集合分取り除こうとしています。辺が削除されると気は複数の小さな気に分裂します。結果として得られる全ての木の直径が全て 以下であれば、辺の集合は有効です。
2つの辺の集合は一方にしか現れないような辺がある場合、異なります。
有効な辺の集合の数 modulo を数えてください。
入力
1行目には2つの整数 が与えられる、それぞれ木の頂点数と最大許容直径である。
つづく 行のそれぞれには辺の記述が与えらえる: 2つの整数 。
与えられた辺は木を形成する。
出力
単一の整数を出力せよ、その数は有効な辺の集合の数 modulo である。
入出力例
4 3 1 2 1 3 1 4
8
2 0 1 2
1
6 2 1 6 2 4 2 6 3 6 5 6
25
6 3 1 2 1 5 2 3 3 4 5 6
29
注記
1つ目の入出力例では、与えられた木の直径は既に 以下です。したがって削除する辺の集合を任意に選べ、結果として得られる木の直径は 以下です。集合は空のものも含め 個あります。
2つ目の入出力例では、唯一の辺を削除しなければなりませんうでなければ、直径が となり、 よりも大きくなります。
3つ目と4つ目の入出力例の木はこちらです。
G. Graph Coloring / Раскраска графа
テストごとのメモリ制限: 1024 MB
入力: 標準入力
出力: 標準出力
古典的で簡単そうな響きでしょう? さて、次の形式の 個のクエリを処理しなければなりません。
- — 第1部の頂点 と第2部の頂点 を結ぶ新しい辺を追加する。この辺は次のように新しいインデックスを取得する: 最初に追加された辺はインデックス で2番目は 等々という感じである。辺の追加後、現在の最適彩色のハッシュを出力しなければならない(最適彩色が複数存在する場合、そのいずれかのハッシュを出力する)。実際には、このハッシュは確認されず、このクエリへの答えとして任意の数を出力することができるが、このハッシュを持つ彩色を出力するように求められることがある。
- — 前のクエリを処理したのと同じハッシュのグラフの最適彩色を出力します。このタイプのクエリはタイプ1のクエリの後にしか来ず、高々 回までしか来ない。このハッシュに対応する最適彩色が複数ある場合、そのうちのいずれかを出力せよ。
ある彩色で辺が赤や青だったとしても次の彩色ではその色が変わるかもしれません。
彩色のハッシュは次のように計算されます: を赤い辺のインデックスの集合とした時ハッシュは となります。
この問題はonline
で解かなければならないことに注意してください。つまり、入力全体を一度に読むことができないということです。最後のクエリの応答が出力されてから初めて各クエリを読むことができます。プログラム内で各出力ののち、C++
ではfflush
、Java
ではBufferedWriter.flush
という関数を用いてください。
入力
1行目には3つの整数 が与えられる。
その後、 行が続き、その 行目には2つの整数 が与えられる、これは 番目の辺が第1部の頂点 と第2部の頂点 をと結んでいることを表す。
次の行には1つの整数 が与えられる、これは処理しなければならないクエリの数である。
つづく 行には問題文に記載されている形式のクエリが与えられる;
入力の追加制約:
- どの時点においてもグラフ多重辺を持たない
- タイプ のクエリは前のクエリがタイプ のクエリであるときにしか来ない
- タイプ のクエリは最大 個である
出力
タイプ に答えるためには1つの整数を出力せよ、その数は最適彩色のハッシュである。
タイプ に答えるためには1行を出力せよ。これは整数 で始まっていなければならない、この数は赤い辺の本数である。そののち、 個の異なる整数が続く、これらは彩色における赤い辺のインデックスで、順番は問わない。各インデックスは既存辺に対応してなければならず、生成する彩色のハッシュは1つ前の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
8 8 1 3 40 2 3 5 104 3 5 6 3 104 360 4 5 6 3 8