Codeforces Round #590 (Div. 3) C
此题无坑,自己挖坑!
本来比赛中应该A的代码,就因为我在N==1的时候加了一组特判,然后一直就WA2,后来发现Test 2是强数据,而我一直在怀疑我的思维错了,就一直没交了,最后这道1400分的题,赛后把那行给删了之后就过了……哎
这道题,我们可以把序号1、2的看成是一样的,再把序号3、4、5、6看成是一样的,所以在这里我看成了1号整体与2号整体。
然后,其实我们不难发现,路径是唯一的,也就是说我们的走法是唯一的,我们只需要判断下一步是不是还可以走就可以了。还有到达终点的过程。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&( -x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define efs 1e-7
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 2e5 + 7;
int N, dir[3][maxN];
char op[3][maxN];
inline bool dfs(int x, int y, int las_op, int lx, int ly)
{
if(x == N + 1 && y == 1) return true;
if(x > N || y > 2 || y < 1) return false;
if(dir[y][x] == 1)
{
if(lx == x) return false;
return dfs(x + 1, y, 1, x, y);
}
else
{
if(lx == x) return dfs(x + 1, y, 2, x, y);
else return dfs(x, 3 - y, 2, x, y);
}
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d", &N);
for(int i=2; i>=1; i--) scanf("%s", op[i] + 1);
for(int i=1; i<=2; i++)
{
for(int j=1; j<=N; j++)
{
if(op[i][j] <= '2') dir[i][j] = 1;
else dir[i][j] = 2;
}
}
// if(N == 1)
// {
// if(dir[1][2] == 2 && dir[1][1] == 2) printf("YES\n");
// else printf("NO\n");
// continue;
// }
bool flag;
if(dir[2][1] == 1) flag = dfs(2, 2, 1, 1, 2);
else flag = dfs(1, 1, 2, 1, 2);
printf(flag ? "YES\n" : "NO\n");
}
return 0;
}
/*
1
7
3126246
2334263
NO
1
7
4211256
6254232
NO
*/
那组注释,血亏啊!!!QAQ涨了8分嘻嘻嘻~