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