ウホウホゴリラッホ

主に勉強したことをまとめていきます。twitter:@pytran3

template付きの関数の書き方

template付きの関数

以下の問題でpriority_queueの昇順・降順を引数で上手いことやりたくて実装した。(これ自体はもっと上手いことやれそう?でも昇順降順で型が違うのでできなさそう?)

D - 3N Numbers

atcoder.jp

Submission #6361635 - AtCoder Regular Contest 074

実装例

Tってもっと具体的な型を書けないのだろうか。
以下は長さ2nのうちn個使った時のvector a和をとることを考えている。ここでans[i]には区間[0, n+i)で優先度Tに基づいて採用した場合の和が入る。

template<typename T> vector<ll> cum(const vector<ll>& a, int n, priority_queue<ll, vector<ll>, T> q) {
  vector<ll> ans(n+1);
  ll sum = accumulate(a.begin(), a.begin()+n, 0ll);
  REP(i, n) {
    q.push(a[i]);
  }
  ans[0] = sum;
  REP(i, n) {
    q.push(a[n+i]);
    sum += a[n+i] - q.top();
    q.pop();
    ans[i+1] = sum;
  }
  return ans;
}