Problem:
Score : 500 points

Problem Statement

#nck {
width: 30px;
height: auto;
}

There are N computers and N sockets in a one-dimensional world.
The coordinate of the i-th computer is a_i, and the coordinate of the i-th socket is b_i.
It is guaranteed that these 2N coordinates are pairwise distinct.

Snuke wants to connect each computer to a socket using a cable.
Each socket can be connected to only one computer.

In how many ways can he minimize the total length of the cables?
Compute the answer modulo 10^9+7.

Constraints

1 ≤ N ≤ 10^5

0 ≤ a_i, b_i ≤ 10^9

The coordinates are integers.

The coordinates are pairwise distinct.

Input

The input is given from Standard Input in the following format:

N
a_1
:
a_N
b_1
:
b_N

Output

Print the number of ways to minimize the total length of the cables, modulo 10^9+7.

Sample Input 1

2
0
10
20
30

Sample Output 1

2

There are two optimal connections: 0-20, 10-30 and 0-30, 10-20.
In both connections the total length of the cables is 40.

Sample Input 2

3
3
10
8
7
12
5

Sample Output 2

1

Solution in PyPy3 (2.4.0) (judge verdict: Wrong Answer)

from collections import Counter, defaultdict
import sys
sys.setrecursionlimit(10 ** 5 + 10)
# input = sys.stdin.readline
from math import factorial
import heapq, bisect
import math
import itertools


import queue
from collections import deque


def main():
    num = int(input())
    data_pc = [int(input()) for i in range(num)]
    data_tap = [int(input()) for i in range(num)]

    data_pc.sort()
    data_tap.sort()

    ans = 1
    mod = 10 ** 9 + 7

    count_span = [0 for i in range(num + 1)]

    ind_tap = 0
    for ind_pc in range(num):
        count_tap = 0
        while ind_tap < num:
            if data_tap[ind_tap] > data_pc[ind_pc]:
                break
            count_tap += 1
            ind_tap += 1
        count_span[ind_pc] = count_tap

    count_span[num] = num - sum(count_span)

    # print(count_span)

    count_0 = 0
    count_tap = 0
    for i in range(num + 1):
        if count_span[i] == 0:
            count_0 += 1
        else:
            minus = min(count_0, count_tap)
            for i in range(2, minus + 1):
                ans *= i
                ans %= mod
            count_0 -= minus
            count_tap -= minus

            count_tap += count_span[i]
            minus = min(count_0, count_tap)
            for i in range(2, minus + 1):
                ans *= i
                ans %= mod
            count_0 -= minus
            count_tap -= minus



    # for i in range(2, count_tap + 1):
    #     ans *= i
    #     ans %= mod

    print(ans)












if __name__ == '__main__':
    main()