Codeforces Round #97
Result
444(1WA) / 936 / 1200 / (4WA) / -
36位 2036 -> 2140
A. Replacement
問題
数列が与えられる。この数列の項を一つだけ(必ず)変更して、ソートする。
変更後にそれぞれの位置に来る項の最小値を求めよ。
制約条件
n≦10^5
数列の各項は1以上10^9以下
試行錯誤
最大要素を1にすればいいんじゃないだろうか。
やけに簡単。書いた。送信。
WA.
あ、最大の要素が1だったら2にしないといけない。
訂正。送信。pretest passed.
B. Rectangle and Square
問題
8つの点が与えられる。
それらを4つの点からなる共通しない集合2つに分ける。
そのうち一方が正方形の4頂点になっていて、もう一方が長方形の4頂点になっている(正方形でもよい)ような分け方は存在するか。
存在するならYESおよびその分け方を一通り出力し、そうでないならNOを出力せよ。
制約条件
座標の絶対値は10^4以下
試行錯誤
全通り試すだけなのでは。
next_permutation使って全通り調べるコードを書く。
意外に実装めんどい。
サンプル合わない。
長方形の判定まちがってる。ADはABを90度回転させたものではなくて、
方向だけが90度違う。長さで割らないと。
合った。送信。
今日少し幾何を解いていたのでそこそこ早く書けた(つまったけど)。
C. Zero-One
問題
0と1からなる文字列に対して二人が次のようなゲームをする。
- 手番を交互にもつ
- 手番のプレイヤーは1つ文字を消す
- 残りが2文字になったら終了
- 先手は、残る文字列を最小化し、後手は残る文字列を最大化する
ただし、与えられる文字列には'?'があり、
そこには0または1の好きな文字を当てはめてよい。
結果として残る文字列としてありうるものを全て出力せよ。
制約条件
長さ≦10^5
試行錯誤
先手は0,1があったら1を消す。
後手は0,1があったら0を消す。
じゃあ0,1が複数個ある場合どれを消すのだろう。
一番左から消していくっぽい。
てことは、同数の0,1があった場合01または10が出来て、
そうじゃないときは00か11固定になる。
同数の0,1があったとき、一番右が0と1どっちになりうるかで01ができるか10ができるかが決まる。
nが奇数の場合個数がずれてめんどい……
なんか凄く汚いコードになったけどまあサンプル合ってるので送信。
pretest passed.
D. Cycle
問題
0と1からなるグリッドが与えられる。
このなかで、coolなcycleのうち、最も長さの長いものの長さを求めよ。
coolなcycleとは以下を満たすcycleである。
(辺を共有して)隣接する1からなる折れ線で、
どのcycle上の1も、2つの(同じcycleに属する)1に隣接している。
かつ、内部には1を含まない。
制約条件
幅,高さ≦1000
試行錯誤
グリッドは、1をたどると、ループがいくつかできてて、
その中で一番長いものを選べばいい、のか?
でも内部に1が含まれてるとダメなので、枝分かれがあったらなるべく内側を通りたい。
うーん?
cycleの内側は全部0で埋まっているわけなので、内側の0を塗りつぶしていって、その周がcycleになっているかを見ればよいのでは。
隣接は8方向を見ればよくて、最外周以外で1があったらだめなのはどうなるだろう。
3方向以上で0と隣接してたらダメ?
書いてみよう。
あれ全然答えあわない。あー嘘すぎる、角とか余裕で3つの0と隣接するし。
全部の1が二つの1と連結しているかチェックする。
サンプル合った。
送ってみる。WA.
その後ad-hocに色々修正して送ってみるけど全部WA.
E
読んだけど題意がわからない。
System Test
A,B,C通った。