Div. 2 B. Hyperset
$O(n^3)$だと厳しいので、どうやって計算量を落とすか、という問題(C++で枝狩りすれば$O(n^3)$で通るようですが)
・半分全列挙で$O(n^2)$に。
→本当に半分だと半分全列挙は思いつきやすいけど、$O(n^3)$を$O(n^2)$に落とすとき思いつきにくくなるので注意。
コンテストへのリンク
A. Garland
・(上手く貪欲すれば解けるらしいけど)制約を見るとDPが自然
→偶奇のどちらを使ったか、偶数・奇数それぞれを何個使ったかを持ってDP。これで$O(n^3)$
・コンテスト中は、i番目を見るとき、今まで使った偶数の個数+奇数の個数がiになることを使えば$O(n^2)$になるし、DP配列を使い回せばメモリ節約できる……とか混乱してハマった。
→この問題は制約が甘いので、$O(n^3)$で簡単に書けば良い。まあ$O(n^2)$にするだけなら良いと思うけど、後半のDP配列の使い回しは混乱を招くので避けるべきだった。
B. Numbers on Tree
・制約を確認!!
→これも制約が甘いので、単純な$O(n^2)$でOK。葉から貪欲にnodeの値を決め、今まで使った数字の間の値にしたくなったなら、それより大きい数字を一個ずつずらせば良い。
C1. Madhouse (Easy version)
・「全ての部分列」にはかなりの情報量が含まれるので、簡単に決まるのでは?
→1:nと2:nだけで決定できる!
0 件のコメント:
コメントを投稿