题意
一些二元组(x,y)
 求多少种排列,使得x不递增(包括相等),y不递增(包括相等)
第一反应 二维偏序 然后想想不对劲 这玩意有组合数
 所以想到了 倒着来求 可是 又要去重 很快 就意识到 是一个容斥问题了
 13样例 wa了3 发 真实。。。。 因为我减了2次 只加了一次mod 输出一直是负数 加 2 * mod 就过了 醉了
 细节要注意orz
 ps tmp3 等于0的情况 只有 整体不能产生 一个二维 都是 不递减的序列 这样产生不了first 和 second 重复的
 此时 必然是0
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define int long long
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
const int mod = 998244353;
int n;
pair<int, int > a[maxn];
int fec[maxn];
bool cmp(pair<int, int> a, pair<int, int> b) {
	return a.second < b.second;
}
signed main() {
	fastio;
	cin >> n;
	fec[0] = 1;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i].first >> a[i].second;
		fec[i] = fec[i - 1] * i % mod;
	}
	sort(a + 1, a + 1 + n);
	int tmp1 = 1;
	int tmp2 = 1;
	int tmp3 = 1;
	for(int i = 1; i <= n; i ++) {
		int cnt = 1;
		int j = i + 1;
		while(j <= n && a[i].first == a[j].first) cnt ++, j ++;
		tmp1 = tmp1 * fec[cnt] % mod;
		i = j - 1;
	}
	for(int i = 1; i <= n; i ++) {
		int cnt = 1;
		int j = i + 1;
		while(j <= n && a[i].first == a[j].first && a[i].second == a[j].second) cnt ++, j ++;
		tmp3 = tmp3 * fec[cnt] % mod;
		i = j - 1;
	}
	for(int i = 1; i < n; i ++)
		if(a[i].second > a[i + 1].second) tmp3 = 0;
	sort(a + 1, a + 1 + n, cmp);
	for(int i = 1; i <= n; i ++) {
		int cnt = 1;
		int j = i + 1;
		while(j <= n && a[i].second == a[j].second) cnt ++, j ++;
		tmp2 = tmp2 * fec[cnt] % mod;
		i = j - 1;
	}
	int sum = 1;
	for(int i = 1; i <= n; i ++)
		sum = (sum * i) % mod;
		
	cout << (sum - tmp1 - tmp2 + tmp3 + 2 * mod) % mod << endl;
	return 0;
}

 京公网安备 11010502036488号
京公网安备 11010502036488号