const int MAXN = 110000; int num[2][MAXN], dir[2][MAXN]; void input(int n, int* tnum, int* tdir) { char t; REP(i, n) { cin >> tnum[i] >> t; if (t == ‘L‘) tdir[i] = 0; else tdir[i] = 1; } } void Go(int& ind, int all, int& n, int& d, int& p, int& foot, int* tnum, int* tdir) { if (ind >= all || n == INF) return; if (d == 0) p -= foot; else p += foot; n -= foot; if (n == 0) { if (++ind >= all) { n = INF; d = -1; return; } n = tnum[ind]; d = tdir[ind]; } } int main() { // freopen("in.txt", "r", stdin); int a, b; RII(a, b); input(a, num[0], dir[0]); input(b, num[1], dir[1]); int ia = 0, ib = 0, pa = 0, pb = 0, da = dir[0][0], db = dir[1][0], foot; int na = num[0][0], nb = num[1][0], ans = 0, Min; while (ia < a || ib < b) { foot = abs(pa - pb); if (pa == pb || da == db) { } else if (na == INF) { if (((pa < pb) != db) && (foot <= nb)) ans++; } else if (nb == INF) { if (((pb < pa) != da) && (foot <= na)) ans++; } else if (((pa < pb) == (da > db)) && (foot % 2 == 0) && (na >= foot / 2) && (nb >= foot / 2)) { ans++; } Min = min(na, nb); Go(ia, a, na, da, pa, Min, num[0], dir[0]); Go(ib, b, nb, db, pb, Min, num[1], dir[1]); } cout << ans << endl; return 0; }
const int MAXN = 110000; int n[2][MAXN]; int d[2][MAXN]; void input(int* num, int* dir, int n) { char t; REP(i, n) { scanf("%d %c ", &num[i], &t); if (t == ‘L‘) dir[i] = -1; else dir[i] = 1; } } void move(int& ind, int& n, int& d, int& pre, int& all, int& p, int* num, int* dir) { pre = p; if (ind == all) return; p += d; if (--n == 0) { ind++; n = num[ind]; d = dir[ind]; } } int main() { // freopen("in.txt", "r", stdin); int a, b; while (~RII(a, b)) { input(n[0], d[0], a); input(n[1], d[1], b); int prea = 0, preb = 0, pa = 0, pb = 0; int na = n[0][0], nb = n[1][0], da = d[0][0], db = d[1][0], ia = 0, ib = 0; int ans = 0; while (ia < a || ib < b) { move(ia, na, da, prea, a, pa, n[0], d[0]); move(ib, nb, db, preb, b, pb, n[1], d[1]); if (prea != preb && pa == pb) ans++; } cout << ans << endl; } return 0; }
原文:http://blog.csdn.net/wty__/article/details/21184375