题目链接
http://poj.org/problem?id=2893
分析
此处有一结论:将数码按原有顺序写成一列并除去 0 0 0 后,
若 N N N 为奇数,则初始状态和目标状态逆序对数奇偶性相同;
若 N N N 为偶数,则初始状态逆序对数加上 0 0 0 在两种状态下行数之差与目标状态逆序对数奇偶性相同。
AC代码
#include <cstdio>
#include <cstring>
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 1e3 + 5;
int tot, bit[maxn * maxn];
inline int ask(int x) {
int ret = 0;
while (x) ret += bit[x], x -= x & -x;
return ret;
}
inline void add(int x, int d) {
while (x <= tot) bit[x] += d, x += x & -x;
}
int main() {
int m, n, pos;
while (scanf("%d%d", &m, &n) == 2 && m && n) {
memset(bit, 0, sizeof(bit));
tot = m * n - 1;
long long cnt = 0;
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j) {
int x = read();
if (x) cnt += ask(tot) - ask(x), add(x, 1);
else pos = i;
}
if (n & 1) {
if (cnt % 2 == 0) printf("YES\n");
else printf("NO\n");
} else {
if ((cnt + pos - 1) % 2 == 0) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}