ZrOJ #882. 画画
最后染成的图形一定一样的。
那么只用考虑两条路径在那些地方重合,重合的地方可以交换,这样答案就是2的重合次数次方。直接模拟就行了。
qiang…
CODE
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int MAXN = 100005;
int n, r[MAXN], c[MAXN];
int main () {
int T; scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &r[i]);
for(int i = 1; i <= n; ++i) scanf("%d", &c[i]);
--r[1], --c[1];
int x = 1, y = 1, X = 1, Y = 1, ans = 1;
bool same = 1;
for(int i = 1; i <= (n-1)<<1; ++i) {
if(!r[x] || y == n) ++x;
else ++y;
if(!c[Y] || X == n) ++Y;
else ++X;
if(x == X && y == Y) {
--r[x], --c[y];
if(!same) same = 1, ans = 2ll * ans % mod;
}
else --r[x], --c[y], --r[X], --c[Y], same = 0;
}
for(int i = 1; i <= n; ++i) if(r[i] || c[i]) ans = 0;
printf("%d\n", ans);
}
}