Educational Codeforces Round 107 問題文和訳
- A. Review Site / Сайт отзывов
- B. GCD Length / Длина НОД
- C. Yet Another Card Deck / Очередная задача про колоду карт
- D. Min Cost String / Строка минимальной стоимости
- E. Colorings and Dominoes / Раскраски и домино
- F. Chainword / Чайнворд
- G. Chips on a Board / Фишки на доске
A. Review Site / Сайт отзывов
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
しかし、このサイトは内部的にはそれほど単純ではありません。サーバが2台あり、「いいね」と「ひどいね」をそれぞれのサーバが別々にカウントしています。
人のレビュアーが1人ずつサイトを訪れます。各レビュアーは以下のタイプのいずれかです。
- タイプ : レビュアーは映画を見て気に入り、「いいね」ボタンを押す
- タイプ : レビュアーは映画を見て気に入らず、「ひどいね」ボタンを押す
- タイプ : レビュアーは映画を見ないで、自分のいるサーバの「いいね」と「ひどいね」の現在の数を見て、どちらのボタンを押すかを決める。「ひどいね」が「いいね」より多い場合、この映画に対して「ひどいね」を押す。そうでない場合、この映画に対して「いいね」を押す。
各レビュアーは1回のみ映画に対して評価を行います。
サーバが2つあるので、映画にできるだけ多くの「いいね」が付くように投票を操作することができます。レビュアーがサイトを訪れたときその人のタイプが分かるので、第1サーバに送るか第2サーバに送るかを選ぶことができます。
各レビュアーをどちらのサーバに送るかを決めたとき、両方のサーバで集められる「いいね」の合計値の最大値はいくらでしょう?
入力
1行目には単一の整数 が与えられる、これはテストケースの個数である。
その後、 個のテストケースについての記述が続く。
各テストケースの1行目には単一の整数 が与えられる、これはレビュアーの人数である。
各テストケースの2行目には 個の整数 が与えられる、これらはサイトを訪れる順に並べたレビュアーの種類である。
出力
各テストケースについて、単一の整数を出力せよ、その整数とは各レビュアをどちらのサーバーに送るかを決めたとき、両方のサーバで集められる「いいね」の合計値の最大値である。
入出力例
4 1 2 3 1 2 3 5 1 1 1 1 1 3 3 3 2
0 2 5 2
注記
入出力例の1つ目のテストケースでは、唯一のレビュアをどちらのサーバにも送ることができますが、どちらにしても「ひどいね」を押します。この映画は「いいね」の評価を受けません。
入出力例の2つ目のテストケースでは、レビュアーを全員第1サーバに送ることができます。
- 1人目のレビュアーが「いいね」を押す
- 2人目のレビュアーが「ひどいね」を押す
- 最後のレビュアーが「ひどいね」が「いいね」を上回っていなことを確認し、「いいね」を押す
「いいね」は合計で2つです。別の方法として、1人目のレビュアーと2人目のレビュアーを第1サーバに、最後のレビュアーを第2サーバに送ることもできます。
- 1人目のレビュアーが第1サーバで「いいね」を押す
- 2人目のレビュアーが第1サーバで「ひどいね」を押す
- 最後のレビュアーが第2サーバで「いいね」も「ひどいね」もないことを確認し、「いいね」を押す
B. GCD Length / Длина НОД
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
次の条件を満たす2つの正整数 を求めて下さい。
- 先行ゼロを除いた の十進数表現は 桁である
- 先行ゼロを除いた の十進数表現は 桁である
- 先行ゼロを除いた の十進数表現は 桁である
は整数 と の 最大公約数(greatest common divisor, GCD)*1を表します。
と を出力してください。答えが複数存在する場合、そのいずれかを出力してください。
入力
1行目には単一の整数 が与えられる、これはテストケースの個数である。
続く 行のそれぞれには3つの整数 が与えられる、これらは数字の長さの条件である。
与えられた制約のもとで、全てのテストケースに対して答えが存在することは証明できる。
入力についての追加制約: 全てのテストケースは異なるものである。
出力
各テストケースについて2つの整数を出力せよ、その2つの整数は以下の条件を満たす である。
- 先行ゼロを除いた の十進数表現は 桁である
- 先行ゼロを除いた の十進数表現は 桁である
- 先行ゼロを除いた の十進数表現は 桁である
入出力例
4 2 3 1 2 2 2 6 6 2 1 1 1
11 492 13 26 140133 160776 1 1
注記
入出力例では次の通りになります。
C. Yet Another Card Deck / Очередная задача про колоду карт
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
個のクエリを処理しなければなりません。 番目のクエリは整数 で表されます。各クエリについて次のようなことを行わなければなりません。
- デッキ内で色 である最も上のカード、即ち、最小のインデックスを持つカードを見つける
- 見つけたカードの位置を出力する
- そのカードを取り出し、デッキの一番上に置く
入力
1行目には2つの整数 が与えられる、これらはデッキ内のカードの枚数とクエリの個数である。
2行目には 個の整数 が与えられる、これらはカードの色である。
3行目には 個の整数 が与えられる、これらはクエリの色である。クエリではデッキ内に存在する色のみを尋ねられることは保証される。
出力
個の整数を出力せよ、それらは各クエリに対する答えである。
入出力例
7 5 2 1 1 4 3 3 1 3 2 1 1 4
5 2 3 1 5
注記
入出力例の説明:
- デッキは で、色 である最初のカードの位置は である。
- デッキは で、色 である最初のカードの位置は である。
- デッキは で、色 である最初のカードの位置は である。
- デッキは で、色 である最初のカードの位置は である。
- デッキは で、色 である最初のカードの位置は である。
D. Min Cost String / Строка минимальной стоимости
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
2つの正整数 が与えられます。ラテン文字の最初の 文字のみを含む長さ の全ての文字列の中で、可能な限り最小コストの文字列を求めて下さい。そのような最小コストの文字列が複数存在する場合は、そのいずれかを出力してください。
入力
唯一の行には2つの整数 が与えられる。
出力
文字で構成され、その各文字がラテン文字の最初の 文字のうちの1つであり、これらの文字列の中でコストが最小となるような文字列 を出力せよ。このような文字列が複数ある場合は、そのうちのいずれかを出力せよ。
入出力例
9 4
aabacadbb
5 1
aaaaa
10 26
codeforces
E. Colorings and Dominoes / Раскраски и домино
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
各白セルを赤か青で塗ります。自明ですが、白セルの数を とすると塗り方は 通りあります。
ボード上の白セルを塗ったのち、次のようなルールに従って最大数のドミノを置いていきます。
- 各ドミノは隣接する2つのセルを覆う
- 各セルは高々1枚のドミノで覆われる
- ドミノを横向きに置いた(1行の2つセルを覆う)場合、赤セルのみを覆う
- ドミノを縦向きに置いた(1列の2つセルを覆う)場合、青セルのみを覆う
ボードの値を置くことができるドミノの最大枚数とします。可能な 通りの塗り方全てについての値の合計を計算してください。個の和が巨大になる可能性があるので、modulo で出力してください。
入力
1行目には2つの整数 が与えられる、これらはそれぞれ行と列の数である。
そののち、 行が続き、各行には 文字の文字列が与えられる。 個目の文字列の 文字目は 行目の 番目のセルが黒のとき *
、そうでないときo
である。
出力
1つの整数を出力せよ、その数とは可能な 通りの塗り方についてボードの値の和を で割った余りである。
入出力例
3 4 **oo oo*o **oo
144
3 4 **oo oo** **oo
48
2 2 oo o*
4
1 4 oooo
9
F. Chainword / Чайнворд
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
チェーンワードの文字セルは1列に並べられています。この課題では長さ のチェーンワードを考えます。
チェーンワードのヒントとは、互いに交差せず、 個の文字セルを全てカバーするような、一連のセグメントのことです。各セグメントには、対応するセルにある単語の説明が含まれています。
奇妙なことに実際にはヒントは2つあります: 1つは文字セルの上の行のセグメント列で、もう1つは文字セルの下の行のセグメント列です。列が異なる場合は、答えの曖昧さを解消するのに役立っています。
単語の辞書が当たられます、各語は小文字のラテン文字から成ります。全ての語は互いに相異なります。
チェーンワードのインスタンスは次のような3つ組です。
- 文字の小文字のラテン文字の文字列
- 第1ヒント: 各セグメントに対応する文字が辞書内の単語となるようなセグメント列
- 第2ヒント: 各セグメントに対応する文字が辞書内の単語となるような別のセグメント列
セグメント列は必ずしも異なるものである必要はないことに注意してください。
チェーンワードの2つのインスタンスは、異なる文字列または異なる第1ヒントまたは異なる第2ヒントを持つ場合、異なるものと見做されます。
チェーンワードの異なるインスタンスの数を数えます。この数はかなり大きくなるかもしれないので、modulo で出力してください。
入力
1行目には2つの整数 が与えられる、これらは辞書の単語数と文字セルの数である。
続く 行のそれぞれには単語が与えられる、これらは小文字のラテン文字 文字以内の空でない文字列である。全ての単語は互いに異なる。
出力
1つの整数を出力せよ、与えられた辞書に対する長さ の異なるチェーンワードのインスタンスの数を で割った余りである。
入出力例
3 5 ababa ab a
11
2 4 ab cd
4
5 100 a aa aaa aaaa aaaaa
142528942
注記
ここにあるのは、1つ目の入出力例についての有効なチェーンワードの全てのインスタンスです。
文字の上の赤い線は第1ヒントのセグメントを、文字の下の青い線は第2ヒントのセグメントを示しています。
2つ目の入出力例では、以下の文字列が考えられます: "abab
", "abcd
", "cdab
", "cdcd
"。ヒントは全て、最初の2文字と最後の2文字をカバーするセグメントです。
G. Chips on a Board / Фишки на доске
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
AliceとBobは次のようなゲームをします。2人は である2整数 を選び、列 から列 まで(区間の両端を含む)の部分のみが残るようにボードを切ります。つまり、列 より左にある全ての列と列 より右にある全ての列はもはやボードの一部ではなくなります。
ボードを切った後、ボードの残った部分(列 から列 までの部分)のチップを移動させます。交互に手を打ち、手を打てなかったプレイヤーがゲームに負けます。1手目はAlice、2手目はBob、3手目はAliceというように進行します。手を打つ際、プレイヤーはボード上のチップを1つ選び、任意の正の数のセル分左に移動させなければなりません(つまり、列 にあったチップは列 に移動させることができ、一番左の列にあるチップは選べない)。
AliceとBobは数の組 を 組持っています。そのような各ペアについて、 としたときに、どちらがゲームの勝者になるかを判別したいと思っています。これらのゲームは独立である(次のゲームのボードの状態には影響を与えない)と考えられ、AliceもBobも最適なプレーを行います。
入力
1行目には2つの整数 が与えられる、これらはそれぞれ行と列の数である。
2行目には 個の整数 が与えられる、ここで は 行目のチップのある列のインデックスである(つまり、 行目のチップは 列目にある)。
3行目には1つの整数 が与えられる。
そののち、 行が続き、その 行目には2つの整数 が与えられる。
出力
文字の文字列を出力せよ。 文字目は、 のゲームでAliceが勝った場合はA
、Bobが勝った場合はB
とする。
入出力例
8 10 1 3 3 7 4 2 6 9 7 2 3 1 3 1 4 1 10 5 10 8 10 9 10
BAAAAAB
Codeforces Round #714 (Div. 2) 問題文和訳
- A. Array and Peaks / Массив и пики (500点)
- B. AND Sequences / Последовательности И (1250点)
- Add One / Добавь единицу (1500点)
- D. GCD and MST / НОД и МОД (2000点)
- E. Cost Equilibrium / Ценовой баланс (2750点)
- F. Swapping Problem / Задача об обмене (3500点)
A. Array and Peaks / Массив и пики (500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
2つの整数 が与えられるので、ちょうど 個のピークをもつ から までの数の順列 を構築してください。大きさ の配列 のインデックス は かつ かつ であるとき、ピークといいます。そのような順列が存在しない場合は、 と出力してください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
それから 行が続き、そのそれぞれには空白で区切られた2つの整数 が与えられる、これらは配列の長さとピークの数である。
出力
行出力せよ。各テストケースについて、与えられた長さとピークの数を持つ順列がない場合は、 と出力せよ。そうでない場合は、 から までの数の順列を形成し、ちょうど 個のピークを持つような空白で区切られた 個の整数を1行に出力せよ。
答えが複数存在する場合、そのいずれかを出力せよ。
入出力例
5 1 0 5 2 6 6 2 1 6 1
1 2 4 1 5 3 -1 -1 1 3 6 5 4 2
注記
入出力例の2つ目のテストケースでは、配列 となります。ここでインデックス と がピークとなります。これは で、 であるからです。
B. AND Sequences / Последовательности И (1250点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
大きさ の配列 が与えられます。列 がよい配列となるような から までの数の順列 の個数を求めて下さい。この数は大きくなる可能性があるので、modulo で出力してください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースの1行目には単一の整数 が与えられる、これは配列の大きさである。
各テストケースの2行目には 個の整数 が与えられる、これらは配列の要素である。
全てのテストケースでの の和が を超えないことは保証されている。
出力
行出力せよ、ここで、 行目には 番目のテストケースでの良い順列の個数を で割った余りを出力せよ。
入出力例
4 3 1 1 1 5 1 2 3 4 5 5 0 2 0 3 0 4 1 3 5 1
6 0 36 4
注記
1つ目のテストケースでは、全ての数が同じなので、どのような順列をとっても良い配列になります。 から までの数の順列は次のように合計で 通り存在します: 。
2つ目のテストケースでは、よい配列となるような順列が存在しないことを証明することができます。
3つ目のテストケースでは、よい配列となるような順列が合計で 通り存在しますそのうち1つが順列 であり、このとき列は となります。これがよい配列となるのは以下の通りです。
Add One / Добавь единицу (1500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
1回の操作では、数の各桁 を の十進数表現に置き換えなければなりません。例えば、 は1回の操作を適用させると となります。
回の操作を適応させた後の の長さを求めなければなりません。この数は大きくなる可能性があるので、modulo で出力してください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースの唯一の行には2つの整数 が与えられる、これらは初期状態の数と操作回数である。
出力
各テストケースについて結果として得られる数の長さを で割った余りを出力せよ。
入出力例
5 1912 1 5 6 999 1 88 2 12 100
5 2 6 4 2115
注記
1つ目のテストケースについて、 は 回の操作の後 となり、その長さは となります。
2つ目のテストケースについて、 は 回の操作の後 となり、その長さは となります。
3つ目のテストケースについて、 は 回の操作の後 となり、その長さは となります。
4つ目のテストケースについて、 は 回の操作の後 となり、その長さは となります。
D. GCD and MST / НОД и МОД (2000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- である場合、 から の間に重さ の辺が存在する
- である場合、 と の間に重さ の辺が存在する
ここで は整数 の最大公約数(greatest common divisor, GCD)*2を表します。
上記の条件の両方を満たす場合、 と の間には多重辺が存在し、何方の条件も満たさない場合、 と の間には辺が存在しないことに注意してください。
目標は、このグラフの最小全域木(minimum spanning tree, MST)*3の重みを求めることです。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
各テストケースの1行目には2つの整数 が与えられる、これらは頂点数とパラメータ である。
各テストケースの2行目には 個の整数 が与えられる、これらは配列の要素である。
全てのテストケースでの の和が を超えないことは保証されている。
出力
行出力せよ。各テストケースでについて対応するグラフの重さを出力せよ。
入出力例
4 2 5 10 10 2 5 3 3 4 5 5 2 4 9 8 8 5 3 3 6 10 100 9 15
5 3 12 46
注記
ここでは、例題の4つのテストケースのグラフを示しています(グラフの可能なMSTの辺はピンク色で示されています)。
テストケース1について
テストケース2について
テストケース3について
テストケース4について
E. Cost Equilibrium / Ценовой баланс (2750点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
以下の手順で、配列を任意の回数変換することができます。
- 2つのインデックス と整数 を選ぶ。 をソースインデックス、 をシンクインデックスとする
- 番目の要素を だけ減らし、 番目の要素を だけ増やす。 番目と 番目で得られる値はそれぞれ となる
- この操作のコストは である
- ここで、 がシンクインデックス、 がソースインデックスになることはなくなる
変換の総コストはステップ の全てのコストの合計です。
例えば、配列 は総コスト で美しい配列 に変換できます。
美しい配列に変換することができ、その変換のコストが一意に定まる配列をバランス型といいます。言い換えれば、美しい配列に変換するための最小のコストは、最大のコストに等しいものです。
非負整数から成る長さ の配列 が与えられます。貴方の仕事は、与えられた配列の並べ替えであるバランス型の配列の数を求めることです。要素が異なる位置が存在する場合2つの配列は異なる配列とみなされます。答えが大きくなる可能性があるため、modulo で出力して下さい。
入力
1行目には単一の整数 が与えられる、これは配列の大きさである。
2行目には 個の整数 が与えられる。
出力
単一の整数を出力せよ、これはバランス型である並び替えの数を で割った余りである。
入出力例
3 1 2 3
6
4 0 4 0 4
2
5 0 11 12 13 14
120
注記
1つ目の入出力例では、値 のインデックスをソース、値 のインデックスをシンクと考えることができるので、 は有効な並び替えです。したがって、変換後は美しい配列 となり,総コストは となります。これが美しい配列になる唯一の変換であることを示すことができます。同様に他の並び替えについても調べることができます。
2つ目の入出力例では、 と がバランス型である並び替えです。
3つ目の入出力例では、すべての並び替えがバランス型です。
F. Swapping Problem / Задача об обмене (3500点)
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
入力
1行目には単一の整数 が与えられる。
2行目には 個の整数 が与えられる。
3行目には 個の整数 が与えられる。
出力
の最小値を出力せよ。
入出力例
5 5 4 3 2 1 1 2 3 4 5
4
2 1 3 4 2
2
注記
1つ目の入出力例では、配列 の1番目と5番目の要素を入れ替えて にすることができます。
従ってその和の可能な最小値は となります。
2つ目の入出力例では、1番目と2番目の要素を入れ替えることができます。つまり、答えは となります。
AtCoder Beginner Contest 198のきろく
AtCoder Beginner Contest 198に参加、レートが+1されました。
- A - Div (100点)
- B - Palindrome with leading zeros (200点)
- C - Compass Walking (300点)
- D - Send More Money (400点、実行時間制限: 5 sec)
- E - Unique Color (500点)
- F - Cube (600点): 未提出
- 結果、感想
A - Div (100点)
A君が 個貰うとすると、B君は 個貰うことになるので かつ より のとき より は整数であるため 通り存在します。 のとき条件を満たす分け方は存在しないので、どちらの場合も 通りとなります。
B - Palindrome with leading zeros (200点)
でない限り先頭に0
はもともと来ないので末尾の0
を削除した文字列が回文なら条件を満たし、そうでなければ条件を満たしません。
文字列が条件を満たしているかどうかは実際に両端から文字が等しいかどうか調べることで判別できます。
C - Compass Walking (300点)
歩移動後に高橋くんがいる点の集合は半径 の円周となります。
そのあともう 歩移動することで、
これ以降は、数学的帰納法により、 歩移動後の点の集合は半径 の円周及び内部となります。
よって、原点から の距離が の時は答え 、 未満の時は答え 、それ以外の時は答え となります。
誤差が怖かったのでfor文を用いて条件を求めましたが、繰り返し回数を 回にしていたため、1つのケースを落としてしまい、2ペナとなってしまいました。上限は のときの となります。
D - Send More Money (400点、実行時間制限: 5 sec)
最初、覆面算 という条件を見落としていて1ペナついてしまいました(問題名の意味を考えれば...)。
文字と数字が対応するため 種類以上の文字を用いている場合、UNSOLVABLE
となります。
そうでない場合、文字と数字の対応を全て試してみます。高々 通りなので間に合います。std::next_permutaion
を用います。 文字目が0
でないか、stoll
を用いて が成り立っているかどうかを判別しましょう。
E - Unique Color (500点)
根からDFSしていきます。答えをstd::set
を用いてとっていく場合は、マージテクを用いるようにしましょう。そうでなければ になってTLEしてしまいます(1敗)。
F - Cube (600点): 未提出
色々回してよく分からなくなりました。
結果、感想
本当にギリギリ暖まりました。4ペナが痛い...
Codeforces Round #713 (Div. 3) 問題文和訳
- A. Spy Detected! / Шпион обнаружен!
- B. Almost Rectangle / Почти прямоугольник
- C. A-B Palindrome / A-B палиндром
- D. Corrupted Array / Испорченный массив
- E. Permutation by Sum / Перестановка по сумме
- F. Education / Образование
- G. Short Task / Короткая задача
A. Spy Detected! / Шпион обнаружен!
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
残りの要素と等しくない要素のインデックスを出力して下さい。配列内の数字は1から順に番号が振られています。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には単一の整数 が与えられる、これは配列 の長さである。
各テストケースの2行目には 個の整数 が与えられる。
配列 の中の1つを除く全ての数字が同じであることは保証されている。
出力
各テストケースについて単一の整数を出力せよ、その整数とは他の要素と等しくない要素のインデックスである。
入出力例
4 4 11 13 11 11 5 1 4 4 4 4 10 3 3 3 3 10 3 3 3 3 3 3 20 20 10
2 1 5 3
B. Almost Rectangle / Почти прямоугольник
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
座標軸に平行な辺を持つ長方形の角になるようにさらに2つのセルをマークしなければなりません。
例えば、 で、長方形の領域が次のような場合(マークされたセルにはアスタリスクが書かれている)、
次のようにさらに2つのセルをマークすることができます。可能な解が複数存在する場合、そのいずれかを出力してください。入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には単一の整数 が与えられる、これは表の行や列の個数である。
続く 行のそれぞれには空のセルとマークされたセルを表す'.
'と'*
'の 文字が与えられる。
全てのテストケースでの の和が を超えないことは保証されている。
領域内位にちょうど2つのアスタリスクがあることは保証されている。これらは同じ行/列にあっても構わない。
解が存在することは保証されている。
出力
各テストケースについて 文字を 行出力せよ、これらは問題文に対応した、4つのアスタリスクのある領域である。正解が複数ある場合、そのいずれかを出力せよ。
入出力例
6 4 ..*. .... *... .... 2 *. .* 2 .* .* 3 *.* ... ... 5 ..... ..*.. ..... .*... ..... 4 .... .... *... *...
*.*. .... *.*. .... ** ** ** ** *.* *.* ... ..... .**.. ..... .**.. ..... .... .... **.. **..
C. A-B Palindrome / A-B палиндром
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
0
', '1
', '?
'から成る文字列 が与えられます。文字列が回文になり、ちょうど 文字の'0
'とちょうど 文字の'1
'をもつように文字列 内の全ての'?
'を'0
'や'1
'に置換しなければなりません。文字'?
'のそれぞれは他とは独立に置換されることに注意してください。長さ の文字列 は全ての について等式 が真である場合、回文と言います。
例えば、 "01?????0
" の場合、次のように文字'?
'を置換することができます。
- "
01011010
" - "
01100110
"
与えられた文字列 と数 と について、文字列が回文になり、ちょうど 文字の'0
'とちょうど 文字の'1
'をもつように文字列 内の全ての'?
'を'0
'や'1
'に置換してください。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には2つの整数 が与えられる。
各テストケースの2行目には文字'0
', '1
', '?
'から成る長さ の文字列 が与えられる。
全てのテストケースでの の文字列長の合計が を超えないことは保証されている。
出力
各テストケースについて次のように出力せよ。
- 文字列が回文になり、ちょうど 文字の'
0
'とちょうど 文字の'1
'をもつように文字列 内の全ての'?
'を'0
'や'1
'に置換できない場合、"-1
" - そうでない場合、置換の結果得られる文字列
文字の置換について適す方法がいくつかある場合、そのいずれかを出力せよ。
入出力例
9 4 4 01?????0 3 3 ?????? 1 0 ? 2 2 0101 2 2 01?0 0 1 0 0 3 1?1 2 2 ?00? 4 3 ??010?0
01011010 -1 0 -1 0110 -1 111 1001 0101010
D. Corrupted Array / Испорченный массив
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
- ある配列 が与えられる
- 配列 を配列 に書き込む、即ち
- 配列 の 番目の要素は配列 の数値の合計である、即ち
- 配列 の 番目の要素にある整数 を書き込む、即ち
- 配列 をシャッフルする
例えば、配列 は次のようにして得ることができます。
与えれた配列 について、最初に与えられた可能性のある配列 のいずれかを求めて下さい。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には単一の整数 が与えられる。
各テストケースの2行目には 個の整数 が与えられる。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて次のように出力せよ。
- 配列 がどんな配列 からも得られない場合、"
-1
" - そうでない場合、 個の整数
複数の配列 が存在する場合、そのいずれかを出力せよ。
入出力例
4 3 2 3 7 12 2 4 9 1 7 1 6 5 5 18 2 2 3 2 9 2 3 2 6 9 2 1
2 3 7 -1 2 2 2 3 9 1 2 6
E. Permutation by Sum / Перестановка по сумме
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
Поликарп*1は4つの整数 が与えられ、次の条件を満たすような から までの数の順列 を求めるように頼まれました。
例えば、 の場合、次のような順列が適します(全ての選択肢が記載されているわけではない)。
しかし については上記の条件に適すような順列は存在しません。
与えられた について上記の条件に合うような から の数の順列を求めるПоликарпの手助けをしてください。適当な順列が複数存在する場合、そのいずれかを出力してください。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースは1行から構成され、4つの整数 が与えられる。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについて次のように個別の行に出力せよ。
- 個の整数 — 上記の条件を満たすような順列が存在する場合で、そのような長さ の順列
- そうでない場合、
-1
適する順列が複数存在する場合、そのいずれかを出力せよ。
入出力例
5 5 2 3 5 5 3 4 1 3 1 2 4 2 2 2 2 2 1 1 3
1 2 3 4 5 -1 1 3 2 1 2 -1
F. Education / Образование
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
Поликарпの会社には役職が 個あり、1から順に番号が振られています。役職 の従業員は毎日 トゥグルグを得ます。役職番号が大きいほど、その従業員はより多くのトゥグルグを得ることができます。最初、Поликарпは役職 に配置され、 トゥグルグを持っています。
各日、Поликарпは2つのうち1つのことをすることができます。
例えば、 の場合、Поликарпはこのように行動することができます。
- 1日目、Поликарпは役職 にいて トゥグルグ得る。ここでは トゥグルグ持っている
- 2日目、Поликарпは役職 にいて 役職 に移る。ここでは トゥグルグ持っている
- 3日目、Поликарпは役職 にいて トゥグルグ得る。ここでは トゥグルグ持っている
- 4日目、Поликарпは役職 にいて 役職 に移る。ここでは トゥグルグ持っている
- 5日目、Поликарпは役職 にいて トゥグルグ得る。ここでは トゥグルグ持っている
- 6日目、Поликарпは役職 にいて トゥグルグ得る。ここでは トゥグルグ持っている
- 6日後、Поликарпはコンピュータを買うことができる
Поликарпが新しいコンピュータを買えるようになる最短日数を求めて下さい。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースの1行目には2つの整数 が与えられる、これらは会社内の役職の数と新しいコンピュータの費用である。
各テストケースの2行目には 個の整数 が与えられる。
各テストケースの3行目には 個の整数 が与えられる。
全てのテストケースでの の和が を超えないことは保証されている。
出力
各テストケースについてПоликарпが新しいコンピュータを買えるようになる最短日数を出力せよ。
入出力例
3 4 15 1 3 10 11 1 2 7 4 100 1 5 10 50 3 14 12 2 1000000000 1 1 1
6 13 1000000000
G. Short Task / Короткая задача
テストごとのメモリ制限: 512 MB
入力: 標準入力
出力: 標準出力
例えば、 となります。
与えられた数 について となるような最小の を求めて下さい。
入力
1行目には単一の整数 が与えられる。そののち 個のテストケースが続く。
各テストケースは1つの整数 で特徴づけられる。
出力
各テストケースについて以下を出力せよ。
- となるような が存在しない場合、"
-1
" - そうでない場合、
入出力例
12 1 2 3 4 5 6 7 8 9 10 39 691
1 -1 2 3 -1 5 4 7 -1 -1 18 -1
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つ目のテストケースでは、デッキをソートすることは不可能です。
Codeforces Round #711 (Div. 2)のきろく
微減...。問題文和訳はこちら
- A. GCD Sum (500点)
- B. Box Fitting / Коробка (1000点)
- C. Planar Reflections / Отражения от плоскостей (1750点)
- D. Bananas in a Microwave / Бананы в микроволновке (2500点): 未提出
- E. Two Houses / Два дома (2500点): 保留
- F. Christmas Game / Рождественская игра (3000点): 未提出
- 結果、感想
A. GCD Sum (500点)
の倍数は各桁の数字の和も の倍数であり、 のいずれかは の倍数であるため、少なくともこの中に が ではないものが存在します。よって から順に試していくことで答えが得られます。
B. Box Fitting / Коробка (1000点)
大きい方から和が を超えないように選んでいくのを長方形がなくなるまで繰り返していけばいいです。これはある金額を支払うのに必要な効果の枚数を最小にする問題の考え方を利用できるのですが、それは の累乗のみであるため、大きさが隣り合う長方形の幅が割り切れる関係であるため貪欲法で求めることができます(参照)。
C. Planar Reflections / Отражения от плоскостей (1750点)
まずDPを考えます。
$$ {\mathrm{dp}}_{i,j} = (\text{崩壊齢が \(i\) である粒子が \(j\) 枚の平面を通過した後の粒子の数}) $$ とすると、$$ {\mathrm{dp}}_{1,j} = 1 $$ で、$$ {\mathrm{dp}}_{i,0} = 1 $$であり、 $$ {\mathrm{dp}}_{i,j} = \sum_{l = n-j}^{n-1} {\mathrm{dp}}_{i-1,l}$$ という漸化式が成り立ち、答えは ですが、このままだと計算量が であり間に合いません。そこで累積和を用いることで計算量を に落とすことができ、これで間に合います。
D. Bananas in a Microwave / Бананы в микроволновке (2500点): 未提出
分かりません...
E. Two Houses / Два дома (2500点): 保留
コンテスト後に適当に提出したらACしました。ちゃんと分かるまで保留します。
F. Christmas Game / Рождественская игра (3000点): 未提出
分かりません...
結果、感想
微減... もっと早く通せれば...
Codeforces Round #711 (Div. 2) 問題文和訳
- A. GCD Sum (500点)
- B. Box Fitting / Коробка (1000点)
- C. Planar Reflections / Отражения от плоскостей (1750点)
- D. Bananas in a Microwave / Бананы в микроволновке (2500点)
- E. Two Houses / Два дома (2500点)
- F. Christmas Game / Рождественская игра (3000点)
A. GCD Sum (500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
例:
整数 が与えられるので を満たすような最小の整数 を求めてください。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。
その後、 行が続き、各行には単一の整数 が与えられる。
1つのテストにおいて全てのテストケースは異なるものである。
出力
行を出力せよ、 行目には 番目のテストケースの答えである単一の整数を出力せよ。
入出力例
3 11 31 75
12 33 75
注記
サンプルの3つのテストケースについて説明します。
テストケース1: :
なので、 である最小の整数 は です。
テストケース2: :
なので、 である最小の整数 は です。
テストケース3: :
の はすでに です。そのため、これが答えです。
B. Box Fitting / Коробка (1000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
また、幅 の2次元の箱が与えられます。 は の累乗であってもなくてもよいことに注意してください。さらに、 は最大の長方形の幅以上です。
与えられた長方形を全て収めることができるような、この箱の最小の高さを求めなければなりません。全ての長方形を収めた後に箱の中に空きスペースがあっても構いません。
箱に収めるために長方形を回転させることはできません。さらに、2つの異なる長方形は重なってはいけません、即ち、任意の2つの異なる長方形の交叉領域の面積は0でなければなりません。
サンプル入力の視覚的説明については注記を参照して下さい。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。各テストケースは2行から成る。
各テストケースについて:
- 1行目には2つの整数 と が与えられる
- 2行目には 個の整数 が与えられる、ここで は 個目の長方形の幅である。各 は の累乗である。
- さらに、
全てのテストケースでの の和は を超えない。
出力
個の整数を出力せよ。 番目の整数は 個目のテストケースの答えであり、これは箱の最小の高さである。
入出力例
2 5 16 1 2 8 4 8 6 10 2 8 8 2 2 8
2 3
注記
サンプル入力の1つ目のテストケースについて、次の図は、与えられた5つの長方形を最小の高さの2次元の箱に収める方法の1つを示しています。
2つ目のテストケースでは、2つのブロック(幅8と2のもの)を3層のそれぞれに置くことで最小の高さの3にすることができます。
C. Planar Reflections / Отражения от плоскостей (1750点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
粒子は平面を直接通過することができますが、各平面は崩壊齢 で反対方向に進む粒子である同一のコピーを生成します。崩壊齢が の粒子は、コピーを生成しません*3。
例えば、2枚の平面があり、粒子が崩壊齢 で(右方向に)発射された場合、次のようなプロセスになります(ここで、 とは崩壊齢 の単一の粒子を表す)。
- 1枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が左向きに を生成し、 を右に通過させる
- 1枚目の平面が を左に通過させ、左向きに を生成する
- 2枚目の平面が を右に通過させる( はコピーを生成しない)
全体として、最終的な粒子の多重集合 は になります(このテストケースの視覚的説明については注記を参照)。
平面の数が多すぎるとGaurangはこの複雑な状況に対応できません。 と が与えられるのでGaurangが多重集合 の大きさを求めるのを手助けをしてください。
多重集合の大きさは非常に大きくなる可能性があるため、modulo で出力しなければなりません。
注意: 粒子は互いに衝突することなく平面間を行き来することができます。
入力
入力の1行目には単一の整数 が与えられる、これはテストケース数である。その後、 行が続き、各行には2つの整数 が与えられる。
さらに、全てのテストケースでの の和は を超えず、全てのテストケースでの の和は を超えない。1つのテストにおいて全てのテストケースは異なるものである。
出力
個の整数を出力せよ。 番目の整数は 個目のテストケースの答えである。
入出力例
4 2 3 2 2 3 1 1 3
4 3 1 2
3 1 1 1 500 500 250
1 2 257950823
注記
1つ目の入出力例の4つのテストケースについて説明します。
テストケース1: は問題文で既に説明されています。
このシミュレーションである下図を参照してください。異なる色の各直線は異なる粒子の経路を表しています。ご覧のように、多重集合には4つの異なる粒子が属します。反射した粒子の間の縦方向の間隔は、見た目をわかりやすくするためだけのものであることに注意してください(前述のように、2つの異なる粒子が互いに衝突することはない)。
テストケース2: は以下のように説明されます。
- 1枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が左向きに を生成し、 を右に通過させる
- 2枚目の平面が を左に通過させる( はコピーを生成しない)
得られた多重集合 の合計サイズは3です。
テストケース3: 平面は3枚ありますが、崩壊齢はたったの1です。ですので、1つの粒子が平面を通過するときに、新しいコピーは生成されません。よって、答えは1です。
テストケース4: 平面は1枚しかありません。粒子は左に新しいコピーを生成します。多重集合 の大きさは2です。
D. Bananas in a Microwave / Бананы в микроволновке (2500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
現在電子レンジの中にあるバナナの数を とします。初期状態では です。 番目の操作では入力に3つのパラメータ が与えられます。 の値に基づいて次のいずれかを行わなければなりません。
タイプ1: — であるような を選び、次の更新を 回行う:
タイプ2: — であるような を選び、次の更新を 回行う:
は小数値でもよいことに注意してください。詳細は入力形式を参照してください。また、 は最小の整数 のことです。
個目のタイムステップでは、 個目の操作をちょうど1度行わなければなりません。
であるような各 についてちょうど 本のバナナを作ることができる最も早いタイムステップを出力してください。ちょうど 本のバナナを作ることができない場合、 を出力してください。
入力
1行目にはスペースで区切られた2つの整数 と が与えられる。
その後、 行が続き、その 行目は 個目のタイムステップを表す。このような各行には区切られた3つの整数 が与えられる。
が与えられていることに注意してください、これは である。従って を求めるには式 を利用せよ。
タイプ1について であり、タイプ2について である。
出力
個の整数を出力せよ、 番目の整数はちょうど 本のバナナを得ることのできる最も早いタイムステップである(不可能な場合は )。
入出力例
3 20 1 300000 2 2 400000 2 1 1000000 3
-1 -1 1 -1 -1 1 -1 -1 -1 3 -1 2 3 -1 -1 3 -1 -1 -1 3
3 20 1 399999 2 2 412345 2 1 1000001 3
-1 -1 -1 1 -1 -1 -1 1 -1 -1 3 -1 -1 -1 3 -1 2 -1 3 -1
注記
1つ目のサンプル入力で、3つのタイムステップで 本のバナナを作成する方法を見てみましょう。初期状態では です。
- タイムステップ1では、 を選び、タイプ1の更新 を2回適用する。よって は6になる
- タイムステップ2では、 を選ぶ。よって の値は変わらない
- タイムステップ3では、 を選び、タイプ1の更新 を1回適用する。よって は16になる
与えられた操作では、3個未満のタイムステップで を達成することができないことは示すことができます。
2つ目のサンプル入力で、2つのタイムステップで 本のバナナを作成する方法を見てみましょう。初期状態では です。
- タイムステップ1では、 を選び、タイプ1の更新 を1回適用する。よって は4になる
- タイムステップ2では、 を選び、タイプ2の更新 を1回適用する。よって は17になる
与えられた操作では、2個未満のタイムステップで を達成することができないことは示すことができます。
E. Two Houses / Два дома (2500点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
fflush(stdout)
、Javaではsystem.out.flush()
、Pythonではstdout.flush()
、Pascalではflush(output)
を用いることができます。他のプログラミング言語を用いている場合はその言語のドキュメントを参照してください。また、インタラクティブ問題についてのガイド(https://codeforces.com/blog/entry/45307)を読むことをお勧めします。Dixit*4はある都市に住んでいます。この都市には 軒の家があります。各家の組にはちょうど1本の有向の道があります。例えば、2軒の家AとBについて、AからBとBからAのどちらかの有向の道はありますが、その両方ではありません。 番目の家に向かう道の本数を とします。
2軒の家AとBは、AからBへ到達可能であり、かつ、BからAへ到達可能であるとき、双方向到達可能です。家Aから家Bへのパスが存在する場合、家Bは家Aから到達可能であるといいます。
Dixitはこの都市に2軒の家、住むための家と勉強のための家を買おうと思っています。もちろん、彼は一方の家からもう一方の家へ移動したいと思っています。そこで彼は双方向到達可能な家AとBの組を求めたいと思っています。このような組の中で彼は の値が最大のものを選びたいと思っています、ここで は家 に向かう道の本数です。最適な組が複数存在する場合、そのいずれを選んでもよいです。
DixitはCodeCraft*5の準備で忙しいので、目的の家の組を見つけるのを手伝ってください、もしくはそのような家の組は存在しないといってあげてください。
問題の入力では、各道路の方向は与えられません。与えられるのは、各家についてその家に向かっている道の本数 だけです。
ジャッジへは1種類のみのクエリを投げることができます: 2軒の家AとBを与え、ジャッジはAからBは到達可能であるかどうかを答えます。クエリの回数には上限はありません。しかし、ジャッジが"Yes
"と答えた後はさらにクエリを投げることはできません。また、同じクエリを2回投げることはできません。
全てのクエリが終わったら(もしくは、ジャッジがクエリに"Yes
"と返したら)、プログラムは2軒の家についての推測を出力し、終了しなければなりません。
詳しくは相互入出力の項を参照してください。
入力
1行目には都市内の家の数を表す単一の整数 が与えられる。次の行には空白で区切られた 個の整数 が与えられる、 個目の整数は 番目の家に向かっている道の本数を表している。
相互入出力
クエリを投げるには"? A B
" *6 と出力せよ。ジャッジは家Aから家Bへ到達可能であれば"Yes
"と、そうでなければ"No
"と返答する。
最終的な答えを出力するには"! A B
"と出力せよ、ここでAとBは の値が可能な最大値であり、双方向到達可能である。そのような家AとBの組が存在しない場合、"! 0 0
"と出力せよ。
最終的な答えを出力した後、プログラムはすぐに終了しなければならない、そうしなければ、Wrong Answerという判定を得る。
同じクエリを2回投げることはできません。クエリの回数には上限はないが、ジャッジが"Yes
"と答えた後はさらにクエリを投げることはできない。プログラムは最終的な答え("! A B
"か"! 0 0
")を出力して終了しなければならない。
間違った形式で質問をしたり、前の質問を繰り返したりすると、Wrong Answerという判定を得る。
クエリの出力後、改行出力、出力のflushを忘れないようにせよ。そうでなければIdleness limit exceeded
となる。出力バッファのflushのためには次を利用せよ。
入出力例
3 1 1 1 Yes
? 1 2 ! 1 2
4 1 2 0 3 No No No No No No
? 2 1 ? 1 3 ? 4 1 ? 2 3 ? 4 2 ? 4 3 ! 0 0
注記
1つ目のサンプル入力では、3軒の家があり、それぞれに1本の流入路がある都市が与えられます。ユーザープログラムは"? 1 2
"というクエリで家 から家 に到達できるかどうかを尋ねます。ジャッジは"Yes
"と答えます。ここでユーザプログラムは、これで正解を判断するのに十分な情報が得られたと判断します。そこで"! 1 2
"と出力して終了します。
2つ目のサンプル入力では、ユーザープログラムは6つの異なる家のペアを問い合わせ、件の2軒の家がこの都市には存在しないと確信できるため最終的に"! 0 0
"と答えます。
F. Christmas Game / Рождественская игра (3000点)
テストごとのメモリ制限: 256 MB
入力: 標準入力
出力: 標準出力
ゲームが始まる前に特別な整数 が選ばれます。ゲームは次のように進行します。
- Aliceがゲームを開始し、手番ごとに交互に行動する
- どの手番においても、手番のプレイヤーは、深さが 以上であるノード(例えば ) を選ぶ。次にこのプレイヤーそのノードにぶら下がっているプレゼントを正整数だけ取り除く、この数を とする
- この 個のプレゼントを 番目のノードの 番目の祖先( とする)に置く(頂点 の 番目の祖先とは が の子孫であり、[tex;i] の深さと の深さの差がちょうど であるような頂点 のとである)。ここで 番目のノードのプレゼントの数 は だけ減少し、それに応じて は だけ増加する
- AliceもBobも最適にプレイをする。手番を打てなくなったプレイヤーが負けです。
木の根として可能なものそれぞれについて、AliceとBobのどちらがゲームに勝つかを求めてください。
注意: 根が であるような木のノード の深さはノード からノード への単純パス上の辺の本数として定義されます。根 自身の深さは0です。
入力
1行目にはスペースで区切られた2つの整数 が与えられる。
続く 行のそれぞれには2つの整数 が与えられる、これらは2つのノード 間の無向辺を表す。これらの辺は ノードの木を形成する。
次の行には配列 を表すスペースで区切られた 個の整数が与えられる 。
出力
個の整数を出力せよ、 番目の整数は、木の根がノード にあるときにAliceがゲームに勝った場合は 、そうでない場合は である。
入出力例
5 1 1 2 1 3 5 2 4 3 0 3 2 4 4
1 0 0 1 1
注記
サンプル入力で根ノードを1とした場合と2とした場合の答えを計算しましょう。
根ノード1
このケースではAliceが勝利します。AlilceとBobの間で考えられるゲームプレイの1つは次のようなものです。
- Aliceがプレゼントを1つノード4からノード3に移動させる
- Bobがプレゼントを4つノード5からノード2に移動させる
- Aliceがプレゼントを4つノード2からノード1に移動させる
- Bobがプレゼントを3つノード2からノード1に移動させる
- Aliceがプレゼントを3つノード3からノード1に移動させる
- Bobがプレゼントを3つノード4からノード3に移動させる
- Aliceがプレゼントを3つノード3からノード1に移動させる
ここでBobは手番を行うことはできず、負けとなります。
根ノード2
このケースではBobが勝利します。考えられるゲームプレイの1つは次のようなものです。
- Aliceがプレゼントを4つノード4からノード3に移動させる
- Bobがプレゼントを4つノード5からノード2に移動させる
- Aliceがプレゼントを6つノード3からノード1に移動させる
- Bobがプレゼントを6つノード1からノード2に移動させる
ここでAliceは手番を行うことはできず、負けとなります。