Codeforces Round #712 (Div. 2) 問題文和訳
- A. Déjà Vu / Дежавю (500点)
- B. Flip the Bits / Меняем биты (1000点)
- C. Balance the Bits / Сбалансируйте биты (1750点)
- D. 3-Coloring / 3-раскраска (2000点)
- E. Travelling Salesman Problem / Задача коммивояжёра (2250点)
- F. Flip the Cards / Переверните карты (3000点)
A. Déjà Vu / Дежавю (500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
z
"や"aaa
", "aba
", "abccba
"は回文ですが、"codeforces
"や"ab
"は回文ではありません。回文には既視感を覚えるので嫌いです。文字列 が与えられます。 のどこかに文字'a
'をちょうど1文字挿入しなければなりません。回文でない文字列を作ることができるならその例を求めてください。そうでなければ、それが不可能であることを報告してください。
例えば "cbabc
"とします。'a
'を挿入することで"acbabc
"や"cababc
", "cbaabc
", "cbabac
", "cbabca
"を作ることができます。しかし"cbaabc
"は回文ですので、他の選択肢のいずれかを出力しなければなりません。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースについての唯一の行には小文字の英字から成る文字列 が与えられる。
全ての文字列の長さの合計は を超えない。
出力
各テストケースについて解が存在しない場合、"NO
"と出力せよ。
そうでない場合、"YES
"と出力し、次の行に構築した長さ の文字列を出力せよ。解が複数存在する場合、そのいずれかを出力せよ。
"YES
"と"NO
"の各文字はどのケース(大文字、小文字)でもよい。
入出力例
6 cbabc ab zza ba a nutforajaroftuna
YES cbabac YES aab YES zaza YES baa NO YES nutforajarofatuna
注記
1つ目のテストケースは、問題文で説明されています。
2つ目のテストケースでは、"aab
"と "aba
"を作ることができます。しかし、"aba
"は回文なので、"aab
"が唯一の正解となります。
3つ目のテストケースでは、"zaza
"と"zzaa
"は正解ですが、"azza
"は正解ではありません。
4つ目のテストケースでは、"baa
"が唯一の正解です。
5つ目のテストケースでは、"aa
"しか作ることができませんが、これは回文です。そのため、答えは"NO
"になります 。
6つ目のテストケースでは、"anutforajaroftuna
"は回文ですが、他の場所に'a
'を挿入すると正解になります。
B. Flip the Bits / Меняем биты (1000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
例えば、 とします。
- 1回目の操作では、長さ の接頭辞は を4つ、 を4つ持つためこれを選ぶことができる:
- 2回目の操作では、長さ の接頭辞は を1つ、 を1つ持つためこれを選ぶことができる:
- 3回目の操作では、長さ の接頭辞を選ぶことは を3つ、 を1つ持つためルール違反となります。
文字列 を有限個の演算(0回でもよい)で文字列 に変換できるでしょうか?
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースの1行目には単一の整数 が与えられる、これは文字列 と の長さである。
続く2行には長さ の と の文字から成る文字列 と が与えられる。
全てのテストケースでの の和は を超えない。
出力
各テストケースについて、 を に変換することが可能であれば"YES
"と、不可能であれば"NO
"と出力せよ。各文字はどのケース(大文字、小文字)でもよい。
入出力例
5 10 0111010000 0100101100 4 0000 0000 3 001 000 12 010101010101 100110011010 6 000111 110100
YES YES NO YES NO
注記
1つ目のテストケースは、問題文で説明されています。
2つ目のテストケースでは、0回の操作で を に変換します。
3つ目のテストケースでは、合法的な操作がないので、 を に変換することは不可能です。
4つ目のテストケースでは、次のような変換を行います。
- 長さ の接頭辞を選び を得る
- 長さ の接頭辞を選び を得る
- 長さ の接頭辞を選び を得る
- 長さ の接頭辞を選び を得る
- 長さ の接頭辞を選び を得る
5つ目のテストケースでは、唯一の合法的な操作は を に変換することです。そこから先は、最初に入力した文字列に戻ることしかできないので、 を に変換することはできません。
C. Balance the Bits / Сбалансируйте биты (1750点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
+
'と'1
'を追加することで有効な数学的表現に変換することができるとき、バランスが取れているといいます。例えば、'(())()
'や'()
', '(()(())
'はバランスが取れていますが、')(
'や'(()
', '(()))(
'はそうではありません。長さ の二進文字列 が与えられます。全ての について以下を満たすような長さ のバランス取れた2つの文字列 を構築してください。
- の場合
- の場合
不可能な場合、そのことを報告してください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースの1行目には単一の整数 が与えられる。
次の行には長さ の0
と1
の文字から成る文字列 が与えられる。
全てのテストケースでの の和は を超えない。
出力
このような2つのバランスの取れた括弧列が存在すれば、1行目に"YES
"と、そうでなければ"NO
"と出力せよ。各文字はどのケース(大文字、小文字)でもよい。
答えが"YES
"の場合は、次の2行に条件を満たすバランスの取れた括弧列 と を出力せよ。
解が複数存在する場合、そのいずれかを出力せよ。
入出力例
3 6 101101 10 1001101101 4 1100
YES ()()() ((())) YES ()()((())) (())()()() NO
注記
1つ目のテストケースでは、 "()()()
", "((()))
"となっています。位置 の文字は等しく、これらは の位置と全く同じです。
2つ目のテストケースでは、 "()()((()))
", "(())()()()
"となっています。位置 の文字は等しく、これらは の位置と全く同じです。
3つ目のテストケースでは、解がありません。
D. 3-Coloring / 3-раскраска (2000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
AliceとBobはあるゲームをしています。 の格子があり、初期状態では空です。 について 行 列のセルを と表記します。 という番号の 色のトークンが無限にあります。
ゲームは次のようにターンが進んでいきます。各ターンはAliceが3色のうちの1色を選びます、これを とします。Bobが である色と空のセルを選び、そのマスに色 のトークンを置きます。
同じ色のトークンが置かれた隣接する2つのセルが存在する場合、コンフリクトが発生しているといいます。2つのセルは共通の辺を共有している場合、隣接していると見なされます。
ある瞬間コンフリクトが発生した場合、Aliceが勝利します。そうではなく、 ターンがコンフリクトが発生せずに完了した(即ち、全てのセルが埋まっている)場合、Bobが勝利します。
Bobが勝利戦略を持っているという証拠があります。Bobとしてゲームをプレイして買ってください。
相互入出力機は適応性があります。つまり、Aliceの色の選択は、Bobのそれまでの動きに依存し得ます。
相互入出力
相互入出力は単一の整数 を読むことから始まる、これはグリッドのサイズである。
その後、ゲームのターンが始まります。各ターンは1つの整数 を読むことから始まる、これはAliceの選択した色である。
次に3つの整数 を出力しなければならない、これらはBobが色 のトークンをセル に置くことを表している。セル には前のターンでのトークンがおかれていてはいけません。手番が無効であったり、ゲームに負けた場合、相互入出力は終了し、Wrong Answerの評価を得る。
ターンが終了したら、予想外の判定を避けるため、すぐに終了せよ。
何かを出力した後、忘れず改行を出力し、出力をflushせよ。そうでなければIdleness limit exceededを得る。出力のflushのためには、次を利用せよ。
- C++の場合、
fflush(stdout)
やcout.flush()
- Javaの場合、
System.out.flush()
- Pascalの場合、
flush(output)
- Pythonの場合、
stdout.flush()
- 他の言語の場合は、ドキュメントを参照せよ
ハックの形式
ハックを行うには、次のテスト形式に従いなさい。
1行目に単一の整数 を出力せよ。
2行目に 個の整数 を出力せよ、ここで は ターン目のAliceの色を表す。
相互入出力機はハックの色のリストから逸脱するかもしれませんが、それはBobが負ける原因になる場合だけである。
入出力例
2 1 2 1 3
2 1 1 3 1 2 3 2 1 1 2 2
注記
サンプルの最終的なグリッドは下図の通りです。同じ色のトークンを持つ隣接する2つのセルがないので、Bobの勝ちです。
このサンプルは入出力の形式を示すためのものです。Bobの最適戦略や相互入出力機の実際の行動を示すことを保証するものではありません。E. Travelling Salesman Problem / Задача коммивояжёра (2250点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
セールスマンは都市 から出発し、全ての都市をちょうど1回訪れ、都市 に戻りたいと考えています。
全ての について都市 から都市 へのフライトの費用は ドルです、ここで は都市 からの最低金額です。絶対値ではないことに注意してください。セールスマンが旅行を終えるための最小総費用を求めてください。
入力
1行目には単一の整数 が与えられる、これは都市数である。
続く 行の 行目には2つの整数 が与えられる、これは都市 の美しさと最低金額である。
出力
単一の整数を出力せよ、これは最小総費用である。
入出力例
3 1 9 2 1 4 1
11
6 4 2 8 4 3 0 2 3 7 1 0 1
13
注記
1つ目のテストケースでは、 の順に移動することができます。
- フライト のコストは である
- フライト のコストは である
- フライト のコストは である
総費用は であり、これ以上改善することはできません。
F. Flip the Cards / Переверните карты (3000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
表の数字が大きい順、裏の数字が小さい順に並んでいれば、山札はソートされているといいます。つまり、全ての について である場合です。
カード をめくるということは、 と の値を入れ替えることです。カードのある部分集合(空でもよい)をめくり、全てのカードを好きな順番に並べなければなりません。山札をソートするためにめくらなければならないカードの最小枚数は何枚でしょうか?
入力
1行目には単一の整数 が与えられる、これはカードの枚数である。
続く 行はカードの説明である。これらの 行目には2つの整数 が与えられる。 から までの各整数はちょうど1回現れる。
出力
デッキをソートすることが不可能な場合、"-1
"を出力せよ。それ以外の場合は、デックをソートするのにめくらなければならないカードの最小枚数を出力せよ。
入出力例
5 3 10 6 4 1 9 5 8 2 7
2
2 1 2 3 4
-1
3 1 2 3 6 4 5
-1
注記
1つ目のテストケースでは、 と のカードをめくります。すると、山札は の順に並びます。 であり なので、ソートされています。
2つ目のテストケースでは、デッキをソートすることは不可能です。