D - Double Landscape KEYENCE Programming Contest 2019 / キーエンス プログラミング コンテスト 2019
解法
まず縦横に同じ数があってはいけない
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; }