题解 CF736D 【Permutations】
题意
左右各
分析
首先发现完美匹配数为
由于是
考虑容斥,去掉一条边的完美匹配数为奇数等价于包含一条边的完美匹配数为偶数,必须包含一条边即为删掉一行一列,于是等价于它的余子式为偶数,同样的,由于
注意到运算在
代码
constexpr int N = 2001;
constexpr int S = 4001;
constexpr int M = 500001;
void Gauss(int n);
std::bitset<S> a[N];
int u[M], v[M];
int n, m;
int main() {
read(n), read(m);
for (int i = 1; i <= m; ++i) {
read(u[i]), read(v[i]);
a[u[i]][v[i]] = true;
}
for (int i = 1; i <= n; ++i) {
a[i][i + n] = true;
}
Gauss(n);
for (int i = 1; i <= m; ++i) {
if (a[v[i]][u[i] + n]) {
puts("NO");
} else {
puts("YES");
}
}
return 0;
}
void Gauss(int n) {
for (int i = 1; i <= n; ++i) {
int now = 0;
for (int j = i; j <= n; ++j) {
if (a[j][i]) {
now = j;
}
}
if (now != i) {
std::swap(a[i], a[now]);
}
for (int j = 1; j <= n; ++j) {
if (i != j && a[j][i]) {
a[j] ^= a[i];
}
}
}
}