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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define sf scanf
#define pf printf
#define pb push_back
#define mp make_pair
#define PI ( acos(-1.0) )
#define IN freopen("nocross.in","r",stdin)
#define OUT freopen("nocross.out","w",stdout)
#define FOR(i,a,b) for(i=a ; i<=b ; i++)
#define DBG pf("Hi\n")
#define INF 2000000000000000000LL
#define i64 long long int
#define eps (1e-8)
#define xx first
#define yy second
#define LOG 19
#define off 2

#define mod 1000000007LL

using namespace __gnu_pbds;
using namespace std ;

typedef tree< i64, null_type, less< i64 >, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

#define maxn 100005

int main()
{
    int n ;

    vector < pair<int,int> > vp ;

    scanf("%d",&n) ;

    for(int i=1 ; i<=n ; i++)
    {
        int x ;
        scanf("%d",&x) ;
        vp.pb(mp(x,0)) ;
    }

    for(int i=1 ; i<=n ; i++)
    {
        int x ;
        scanf("%d",&x) ;
        vp.pb(mp(x,1)) ;
    }

    sort( vp.begin() , vp.end() ) ;

    int a[2] ;

    a[0] = a[1] = 0 ;

    int ans = 1 ;

    for(int i=0 ; i<2*n ; i++)
    {
        if( a[ (vp[i].yy^1) ] != 0 )
        {
            ans = (1LL*ans*a[ (vp[i].yy^1) ])%mod ;
            a[ (vp[i].yy^1) ]-- ;
        }
        else{
            a[ vp[i].yy ]++ ;
        }
    }

    printf("%d\n",ans) ;

    return 0 ;
}