Counting Orders (Codeforces 1827A)
Tags: Math, two pointers

You are given two arrays $$$a$$$ and $$$b$$$ each consisting of $$$n$$$ integers. All elements of $$$a$$$ are pairwise distinct.Find the number of ways to reorder $$$a$$$ such that $$$a_i > b_i$$$ for all $$$1 \le i \le n$$$, modulo $$$10^9 + 7$$$.Two ways of reordering are considered different if the resulting arrays are different.

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10^4$$$). The description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^{5}$$$) — the length of the array $$$a$$$ and $$$b$$$.The second line of each test case contains $$$n$$$ distinct integers $$$a_1$$$, $$$a_2$$$, $$$\ldots$$$, $$$a_n$$$ ($$$1 \le a_i \le 10^9$$$) — the array $$$a$$$. It is guaranteed that all elements of $$$a$$$ are pairwise distinct.The second line of each test case contains $$$n$$$ integers $$$b_1$$$, $$$b_2$$$, $$$\ldots$$$, $$$b_n$$$ ($$$1 \le b_i \le 10^9$$$) — the array $$$b$$$.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^{5}$$$.

Output: For each test case, output the number of ways to reorder array $$$a$$$ such that $$$a_i > b_i$$$ for all $$$1 \le i \le n$$$, modulo $$$10^9 + 7$$$.


Sample Inputs:
5
6
9 6 8 4 5 2
4 1 5 6 3 1
3
4 3 2
3 4 9
1
2
1
3
2 3 4
1 3 3
12
2 3 7 10 23 28 29 50 69 135 420 1000
1 1 2 3 5 8 13 21 34 55 89 144

Sample Outputs:
32
0
1
0
13824

Solution (Python):
def main():
    mod = 1000000007
    t = int(input())
    for i in range(t):
        n = int(input())
        a = list(map(int, input().split()))
        b = list(map(int, input().split()))
        (a.sort(), b.sort())
        res = 1
        ap = bp = 0
        flag = 0
        while ap < n and bp < n:
            if a[ap] > b[bp]:
                bp += 1
            elif a[ap] <= b[bp]:
                if ap >= bp:
                    flag = 1
                    break
                res = res * (bp - ap) % mod
                ap += 1
        if flag:
            print(0)
        else:
            k = bp - ap
            while k:
                res = res * k % mod
                k -= 1
            print(res)
if __name__ == '__main__':
    main()

Solution (Python):
R = lambda : sorted(map(int, input().split()))
for _ in [0] * R()[0]:
    R()
    a = R()
    b = R() + [2000000000.0]
    r = 1
    i = j = 0
    for x in a:
        while x > b[j]:
            j += 1
        r = r * (j - i) % (10 ** 9 + 7)
        i += 1
    print(r)

Solution (Python):
MOD = int(1000000000.0) + 7

def count_reorder_ways(n, a, b):
    a.sort(reverse=True)
    b.sort(reverse=True)
    result = 1
    j = 0
    for i in range(n):
        while j < n and a[i] <= b[j]:
            j += 1
        result = result * (i - j + 1) % MOD
    return result
t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    ways = count_reorder_ways(n, a, b)
    print(ways)