题意
一些二元组(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;
}