Codeforces Round #559 (Div. 2)

バチャ

 

 

A. A pile of stones

問題:ある個数の石xから初めて与えられた操作をする。最小値が0以上のとき、最後に残る石の数を最小化するxを求めよ

 

考察:

Aにしてはちょっと厄介でした。

全体での最小値を0とすることが最適なので、x=0とか適当にして、最後の値-最小値とすればよいです。

 

 

B. Expansion coefficient of the array

問題:k|i-j|<=min(ai,aj)を任意のi,jで満たすような最大のkを求めよ

 

考察:

任意のaiでk|i-j|<=aiとしてよいです。

またこの式で一番厳しいものは、j=0,n-1のどちらかなのでどちらも試します。

 

これをすべてのaiで求めて最小のkを出せばよいです。

 

minを外していい理由ですが、もしai>ajならajを調べるときに抑えられています。

 

 

 

C. The Party and Sweets

問題:n人の男子とm人の女子がいて、男子が女子全員にお菓子を送る。

i番目の男があげた菓子の数の最小値がai

j番目の女が受け取った菓子の数の最大値がbjになった。

送られた菓子の和の最小値を求めよ

 

 

考察:

まずa,bをソートします。

そのとき、a[n-1]>b[0]のとき、実現不可能です。

 

a<=bのとき、ある女子に余分に菓子を送る男子がいることがわかります。

これはaiが大きい男子が余分に送ることが最適なので、a[n-1]から余分に見ます。

 

a[n-1]<b[0]のとき、m人に余分に上げると最小値a[n-1]が実現できません

なので、m-1人に余分に送り、もう1人にはa[n-2]さんが余分に送ります。

 

受け取りてのbさんはだれでも変わらないことは、式を書けば簡単にわかります。

 

以上のことを愚直に実装しますが、n=1やm=1のときに気を付けましょう

 

 

 

D. The minimal unique substring

問題:長さnの01の文字列を構築せよ。ある文字列tを部分文字列として登場する回数が1になる。を満たすtの最小の長さがkになるようにせよ。ただしn%2==k%2

 

考察:

nが奇数のときは01010をk+2個分繰り返した後0をつければよいです。

n=kのときはすべて0にすればよいです

 

nが偶数のときが構築できませんでした。

 

 

 

 

 

E. Permutation recovery

問題:ある順列pを復元せよ。ai:i番目より右側にあって、piより小さい値が出現する最小のindex。が与えられる。

 

 

考察:

iより大きくai未満のindexはpiより小さいです。またpaiはpiより大きいです。

この区間がズレて重なる場合実現不可能です。

 

そうでない場合は適切に辺を張ることでトポロジカルソートで求めることができます。

 

バグりました。

 

 

※通したので追記

後ろから決めないとバグります。setなどを使いましょう

 

辺を張るときにすべてに張るとN^2本の辺になり間に合わないので、隣接するものに張りました。このとき、少し離れている頂点対に張られておらず、前からでも後ろからでも同じ優先度になります。

 

しかし、繰り返すようですが後ろから前に辺があるので、後ろから決めなければいけませんでした。