mini notes

競技プログラミングの解法メモを残していきます。

AOJ Courses DPL_4_B コインの組み合わせ II

問題:https://onlinejudge.u-aizu.ac.jp/courses/library/7/DPL/4/DPL_4_B

解答:https://onlinejudge.u-aizu.ac.jp/status/users/misora192/submissions/1/DPL_4_B/judge/5014179/C++14

解法:半分全列挙で、かつデータ構造が肝。

cnt[x][y]:配列aの前半n/2個のうちx個を使用して和がy以下になるものの個数 とする。(vector<map<ll, ll>>)
これは和がちょうどy個になるようにmapを作っていった後、mapの累積和をとればよい。

その後、後半n - n/2個の全ての和の組み合わせを調べる。後半の和の個数がx、和がsmである場合、前半の和の個数はk-x個であり、cnt[k-x](map<ll, ll>)上で和がl-sm以上r-sm以下となるものを探す。これはlower_bound、upper_boundを使うと高速に求めることができる。