Codeforces Round #530
A. Snowball
問題文に書かれている処理をそのまま実装. 解答例
B. Squares and Segments
横幅および縦幅を広げてしまうと必要なSegment数が増えるため,なるべく正方形に収まるようにするのが最適.対称性より横幅縦幅とする.すると横幅は個以上入る正方形の一辺とすればよい[1].よりとなり,は整数であるからが最適.縦幅は余り部分も必要であるから(横幅)として求まる.
別解(editorial)
求めたい値は縦幅と横幅を,としたときである.ここでは無駄:例えばのとき15個までしか入らないが,とすればを保ちつつ16個入れることが可能.のときもとすることで2個分得する.これは要するに先の「横幅および縦幅を広げると必要なSegment数が増える」に対応し,気持ちとしては「横幅と縦幅を近づけて正方形に近くしたい」という認識でよい気がする.
従って解は対称性よりまたはという形に限られる.editorialではとした後で, さらに丸めについても考えても試している.をからまで動かして確かめてもで間に合うし,この方針を採っている人が多い印象.
C. Postcard
とりあえず記号(とそれとペアの文字)を消去したものを考える.この文字列は必ず残るため,がより大きいとImpossible.等しければそのまま出力.小さければ記号の利用を考える.まず'*'
があればこれ1個から任意文字数作ることが可能なため,適当な1つを文字出して残りの'*'
及び'?'
を0文字にすればよい.無い場合は'?'
を使う:個以上'?'
があればその数だけ文字を出現させればよい.足りなかったらImpossible.
最初書き直したときに「i番目を見ているとき,'*'
がi+2番目にあれば~~」という処理を採用していたのだが,これは先頭がa*
などのときに不発になる.
D. Sum in the tree
解法
editorialがよく分からなかったので自分流に書き換えてみた.よって誤りがあるかも.
求めるべき値がの最小値であるから,の値はなるべく増やしたくない. まず偶数深さの葉についてはを何にしようが他の頂点に影響しないため,素直にとできる.
葉でない場合はどうするか.ここで頂点の親を, の子をとする.いま, である.を最小化したいという要請に合わせて変形すると.前2項は奇数深さゆえ所与であるから,の値を決めればも決まる,すなわちの値に応じのすべての子について値が変化する.を1増やすとが1減るから,が減ることとなる.よってをできるだけ大きく取って損することはない(,すなわちが葉の場合を除くが,これは先に議論した). の各要素は0以上であるから,の最大値はが現れるときであり,となる.構成不可能な場合はこれが0未満になってしまうか否かで判別可能.
気持ちとしては「を小さく持ってしまうと,子らがを再現するために各にその分を持たなければならず,が増大する.よってで出来るだけ負担してあげる」という感じ.
実装はDFSでよい.奇数深さ頂点の場合はの左辺がすべて所与であるからこの式で求まる.偶数深さ頂点の場合は先に述べた処理をそのまま行えばよい.
もう少し簡潔な考察?:が取れる値の範囲に着目すると となる.対応するの値は.先の議論からは大きいほうがよいので右端を採用.
横幅,縦幅をとする.が未満であるとするとき,であったから( の定義)となり個入らない.反対にがより大きいときを考える.のときのがであるとすると,のときのは以下になる( , より, )から縦横の差が広がって正方形から遠ざかる. ↩︎