Codeforces Round #568 (Div. 2)

宴じゃ。2時間半長すぎ

 

 

codeforces.com

 

 

A. Ropewalkers

やるだけです。ソートして、最小値と最大値を中央値から離せばよいです

 

 

 

 

B. Email from Polycarp

問題:意味不明。2つの文字列が与えられるのでナニカを判定する。

 

 

考察:

どうにか読解したあとサンプルを見ると解法が生えます

 

連続する同じアルファベットを座圧します

 

前から見て不一致はダメ

余りはダメ

2つ目の文字列のほうがそれぞれの文字数が多くないとダメ

みたいな感じらしいのでそうします。

 

 

 

 

C1. Exam in BerSU (easy version)

問題:これも問題文がわかりづらかったです。

N個の処理クエリがある。1つでかかる時間はTi。もしi番目の処理までに時間がM経過していたら処理は失敗する。i番目の処理を成功させるために、前の要素を任意に取り除くことができる。取り除く必要がある最小個数をそれぞれで求めよ。

 

 

考察:

頑張ってようやくしたつもりなんですけど、めちゃめちゃわかりづらいですね。

 

C1は全探索でよいです。

手順は

t0からtiまで足す。m以下なら0を出力

そうでないなら、t0からti-1を降順に並べて、m以下になるまで引いていく。

これで間に合います。答えも出ます。

 

 

 

C2の解法を出してたら無限にバグりましたし嘘解法でした。ペナ4という地獄。

 

 

 

 

 

 

C2. Exam in BerSU (hard version)

C1の制約の大きい版です。

 

 

考察:

大きい方からx個取ってs-mより大きくしたいです。(sはt0からti-1まで足したもの)

 

セグメント木を使いましょう。

 

 

あらかじめtiを降順に並べたものと、iをmapで管理しておきます。

降順に並べた状態でセグメント木でSumを取ります

もしiまでに出ていなければ0です。

 

 

どこまでを除外するかで二分探索をすればO*1くらいでしょうか。4sec.なので余裕だと思います。

 

 

 

 

 

 

 

F. Two Pizzas

雑に読んだので誤読があるかもしれません

問題:ピザがM個あり、具材が入っている。具材には10種類1~10がある。ピザを2つ選んでパーティを開きたい。N人の参加者がいて、それぞれ好みの具材がある。任意の好みの具材が、2つのピザのどちらかに入っているとき、その参加者は満足する。

満足する参加者を最大化したい。もしその組が複数ある場合、コスト最小なものを1つ選べ。

 

 

 

 

考察:

2つのピザで網羅する具材の種類を考えます。

具材は最大10個なので2^10を全て考えればよいです。

 

ある具材セットを持たせるピザを1つ、2つでコスト最小化します

 

 

次に、ある具材セットについて参加者何人が満足するかを計算します。

計算量が結構厳しいですが、間に合わなくはないと思います

 

 

最後に全ての具材セットを見て終わりです

 

サンプル合いません終わりです。

 

 

 

 

 

※通したので追記

 ほぼ考察は上で言った通りです。

実装として

1:ある具材セットで満足する人数の前計算

2:ピザの入力。ピザ1つでカバーできる具材セット:最小コストを計算

3:ピザ2つをマージ。ピザ&具材セットみたくすると10^8で計算できる。

 4:ピザ2つの具材セットに対して、ある具材セットを満足させられるか。1の結果を足していく。10^6程度。

 

3は、10^6に落とせます。なんかバグったので無駄に丁寧にやりました。

3がボトルネックなんですけど、4secなので間に合います。なぜか451msで終わりました。

 

ひたすら地道に実装すればよい問題ですけど、なかなか時間がかかって辛いですね。実装力欲しいです。

 

 

 

 

 

感想

個人的には超逆転劇で楽しかったです。

 

12分でAB通した後、Cで6ペナ踏んでDへ。

Dで2ペナ踏んだ後Eへ。Eで1ペナ踏むも何とか通す(1:16)

 

ここから23分でC1C2Dを通しました。最終的に12ペナ6完って感じでした。後半はかなり良かったです(初めからやれ)

 

 

ペナルティがどのくらいかよくわからないんすけど、時間と体力はかなり削られて厳しかったですね。

 

 

正解人数見た感じ、F飛ばしてG1でもよかったのかなと思いました。

ここらへんの戦略は難しいところです。

 

時間作ってFとG1は通すようにしたいです。

ではでは

*1:logN)^2)で求めることができます

 

 

次にx以上の値を除外するとき、i番目まででx以上の値を持つ処理の数を数えなければなりません

もう1つ0,1(現れたかどうか)のセグメント木を持つことでO(logN)で解決できます

 

 

以上でO(N(logN)^2)で解くことができました。

 

 

 

 

嘘解法:

はじめやってしまった嘘解法を記しておきます

 

今までに処理したti-1までの値をmultisetで管理し、s>mになったら大きい順に除外しました

しかしこの解法は間違いです。

m=10

t:5 9 2

このケースを考えます。

正しい解は、0 1 1だとすぐにわかると思います

嘘解法では0 1 2となってしまいます。

 

コンテスト中に気づけて良かった。5ペナは無駄じゃない

 

 

 

 

 

 

D. Extra Element

問題:N個の整数列が与えられる。要素を1つ削除した後、自由に並び替えて等差数列にできるか判定せよ。もしできるなら削除する要素のindexを出力せよ

 

 

考察:

まず昇順に並べます。差を数字毎の個数で管理して、場合分けを頑張れば解けます

端を削除する場合:残りの差がn-2個全て等しければOK

真ん中のn-2個のどれかを削除する場合:

隣との差のカウント-1

右隣-左隣をカウント+1

この操作で、n-2個の差を見ればよいです。

 

 

差のベクトルと、カウントするmapなどで解けます。

はじめに、値とindexを記録しておくことの注意しましょう(ここで2ペナ)

 

 

 

 

 

 

E. Polycarp and Snakes

問題:N*Mのグリッドがある。a,b,c…という模様の縁に平行な線分を引く。あとから重ねたら上書きする。この結果のみが与えられ、構築可能か判定せよ。可能なら例を1つ出力せよ

 

 

考察:

MAPの読み込みですが、aが0からにしたいので空である'.'は-1などにしておきましょう

 

 

各文字が現れる座標をsetで管理します

このとき、どちらもsizeが2以上になったら構築不可能です

 

アルファベットkについて、片方のset.size()が1でxとして、もう片方の最小値がy0、最大値がy1とします

(x,y0),(x,y0+1),...,(x,y1)は、kか、それ以上の数で上書きされていなければなりません。

愚直に調べます。構築で使う答えは(x,y0)(x,y1)になります。

 

全体で出てきた一番大きいアルファベットまで調べればよいです

 

 

ここで注意すべきコーナーがあります。

例えばbはあるが、aがないなどのケースです。

これはaより大きい場所を適当に指定すればよいです。

上から順に調べて、1つ上の結果をコピーしました。読み込みのときに最大のアルファベットの点を1つ記憶しても良いと思います。

 

 

O(NM+26max(N,M