PKU 3646 The Dragon of Loowater

問題

二つの数列a[i]およびb[i]が与えられる。
b[i]から数列c[i]を選び(一つの項は高々一回までしか選ぶことができない)、
すべてのiについてa[i]≦c[i]となるようにしたい。


このときΣc[i]の最小値を求めよ。

制約条件

n≦20000

方針

a[i]を小さい順にソートする。
a[i]に対して、貪欲にまだ使ってないb[i]の最小値を割り当てればよい。


multisetを使ったらTLE.
map<int, int>を使ったら320msで通った。PKUのmultisetしょぼすぎる。

ソースコード

int n, m, h[200000];

int main()
{
	while(scanf("%d%d", &n, &m), n || m){
		rep(i, n) scanf("%d", h + i);
		sort(h, h + n);
		map<int, int> s;
		rep(i, m){
			int t;
			scanf("%d", &t);
			s[t]++;
		}
		ll ans = 0;
		rep(i, n){
			map<int, int>::iterator it = s.lower_bound(h[i]);
			if(it == s.end()){
				puts("Loowater is doomed!"); goto END;
			}
			ans += it->first;
			if(--it->second == 0) s.erase(it);
		}
		printf("%lld\n", ans);
		END:;
	}
	return 0;
}