はまやんはまやんはまやん

hamayanhamayan's blog

カード並べ 2 (Arranging Card 2) [大手前プロコン 2019 C]

https://atcoder.jp/contests/otemae2019/tasks/otemae2019_c

解説

https://atcoder.jp/contests/otemae2019/submissions/6931000

カード列Bを使って、Ciを何個作れるかという問題であるが、カード列Bは毎回並び替えるので、特に順番は関係ない。
関係あるのは、とあるカードが何枚あるかである。
これを元に考えると、各iでの答えは、すべての数について、ある数が(Bで登場する回数)/(C[i]で登場する回数)の最小値が答えになる。
ここまでくれば、解法自体は簡単。
Bで登場する回数は変わらず、iが増えるごとにC[i]で登場する回数の追加になる数の個数が増えるだけなので、
これを計算して、個数の最小値を更新すると答えになる。

int N, A[101010], B[101010];
int cntA[101010], cntB[101010];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> A[i];
    rep(i, 0, N) cin >> B[i];

    rep(i, 0, N) cntB[B[i]]++;

    int ans = inf;
    rep(i, 0, N) {
        int a = A[i];
        cntA[a]++;
        chmin(ans, cntB[a] / cntA[a]);
        printf("%d\n", ans);
    }
}