バイトの競プロメモ

主に競技プログラミング

D - Double Landscape KEYENCE Programming Contest 2019 / キーエンス プログラミング コンテスト 2019

D - Double Landscape


解法

まず縦横に同じ数があってはいけない

abをソートする

そのうえで、大きい数から置ける範囲を考えていくと
前回の範囲を含む長方形となるため、その中から一つ自由に選べる(今までに置いた数だけ 置ける場所は引かれる)
ただし、aかbに置こうとしている数がある場合そこに置かないといけない(自分より大きい数はこの範囲に置けないため 置ける場所は引かれない)

Submission #4048955 - KEYENCE Programming Contest 2019 / キーエンス プログラミング コンテスト 2019

signed main() {
    cin >> n >> m;
    addn(a, n);
    addn(b, m);
    setMod();
    mint res = 1;
    {
        seti sa, sb;
        insert(sa, a);
        insert(sb, b);
        if (sa.size() != n)fin(0);
        if (sb.size() != m)fin(0);
    }
    sort(a);
    sort(b);
    int minu = 0;
    rer(i, n * m, 1) {
        int h = n - lowerIndex(a, i);
        int w = m - lowerIndex(b, i);
        bool ex = 0;
        if (binarySearch(a, i))ex = 1, h = 1;
        if (binarySearch(b, i))ex = 1, w = 1;

        if (ex)res *= h * w;
        else res *= h * w - minu;
        minu++;
    }
    cout << res << endl;


    return 0;
}