Submission #2702364


Source Code Expand

#include "bits/stdc++.h"
using namespace std;
#ifdef _DEBUG
#include "dump.hpp"
#else
#define dump(...)
#endif

//#define int long long
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define all(c) begin(c),end(c)
const int INF = sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = (int)(1e9) + 7;
template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

template<int MOD>
struct ModInt {
	static const int kMod = MOD;
	unsigned x;
	ModInt() : x(0) {}
	ModInt(signed sig) { int sigt = sig % kMod; if (sigt < 0) sigt += kMod; x = sigt; }
	ModInt(signed long long sig) { int sigt = sig % kMod; if (sigt < 0) sigt += kMod; x = sigt; }
	int get() const { return (int)x; }

	ModInt &operator+=(ModInt that) { if ((x += that.x) >= kMod) x -= kMod; return *this; }
	ModInt &operator-=(ModInt that) { if ((x += kMod - that.x) >= kMod) x -= kMod; return *this; }
	ModInt &operator*=(ModInt that) { x = (unsigned long long)x * that.x % kMod; return *this; }
	ModInt &operator/=(ModInt that) { return *this *= that.inverse(); }

	ModInt operator+(ModInt that) const { return ModInt(*this) += that; }
	ModInt operator-(ModInt that) const { return ModInt(*this) -= that; }
	ModInt operator*(ModInt that) const { return ModInt(*this) *= that; }
	ModInt operator/(ModInt that) const { return ModInt(*this) /= that; }

	ModInt inverse() const {
		signed a = x, b = kMod, u = 1, v = 0;
		while (b) {
			signed t = a / b;
			a -= t * b; swap(a, b);
			u -= t * v; swap(u, v);
		}
		if (u < 0) u += kMod;
		ModInt res; res.x = (unsigned)u;
		return res;
	}
};
template<int MOD>
ostream &operator << (ostream &os, const ModInt<MOD> &m) { return os << m.x; }
template<int MOD>
istream &operator >> (istream &is, ModInt<MOD> &m) { signed long long s; is >> s; m = ModInt<MOD>(s); return is; };

using mint = ModInt<1000000007>;

mint pow(mint a, unsigned long long k) {
	mint r = 1;
	while (k) {
		if (k & 1) r *= a;
		a *= a;
		k >>= 1;
	}
	return r;
}

vector<mint> fact, factinv;
void precomputeFactorial(int N) {
	N = min(N, mint::kMod - 1);
	fact.resize(N + 1); factinv.resize(N + 1);
	fact[0] = 1;
	rep(i, 1, N + 1) fact[i] = fact[i - 1] * i;
	factinv[N] = fact[N].inverse();
	for (int i = N; i >= 1; i--) factinv[i - 1] = factinv[i] * i;
}
mint combi(int n, int r) {
	if (n >= mint::kMod)
		return combi(n % mint::kMod, r % mint::kMod) * combi(n / mint::kMod, r / mint::kMod);
	return r > n ? 0 : fact[n] * factinv[n - r] * factinv[r];
}


signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	int N; cin >> N;
	using P = pair<int, int>;
	vector<P> v;
	vector<int> a(N); rep(i, 0, N) {
		cin >> a[i];
		v.emplace_back(a[i], 0);
	}
	vector<int> b(N); rep(i, 0, N) {
		cin >> b[i];
		v.emplace_back(b[i], 1);
	}
	sort(all(v));

	int q = 0;
	int qs = 0;
	mint ans = 1;

	rep(i, 0, v.size()) {
		if (q == 0) {
			qs = v[i].second;
			q++;
		}
		else {
			if (qs == v[i].second) {
				q++;
			}
			else {
				ans *= q;
				q--;
			}
		}
	}
	cout << ans << endl;

	return 0;
}

Submission Info

Submission Time
Task A - 1D Matching
User minaminao
Language C++14 (GCC 5.4.1)
Score 500
Code Size 3303 Byte
Status AC
Exec Time 40 ms
Memory 3060 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 14
Set Name Test Cases
Sample example0.txt, example1.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, example0.txt, example1.txt
Case Name Status Exec Time Memory
000.txt AC 23 ms 1784 KB
001.txt AC 9 ms 1020 KB
002.txt AC 12 ms 1020 KB
003.txt AC 14 ms 1528 KB
004.txt AC 34 ms 3060 KB
005.txt AC 40 ms 3060 KB
006.txt AC 38 ms 3060 KB
007.txt AC 38 ms 3060 KB
008.txt AC 38 ms 3060 KB
009.txt AC 38 ms 3060 KB
010.txt AC 38 ms 3060 KB
011.txt AC 39 ms 3060 KB
example0.txt AC 1 ms 256 KB
example1.txt AC 1 ms 256 KB