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);
	}
}
posted @ 2019-12-14 14:50  _Ark  阅读(194)  评论(0编辑  收藏  举报