CF 322C. Ciel and Robot 枚举+模拟

来源:互联网 发布:keynote for mac 6.1 编辑:程序博客网 时间:2024/06/05 06:07
题意:初始在(0,0) 操作序列为s,该操作序列可以执行无数次.
-1e9<=a,b<=1e9 .问是否能到达(a,b)这个点?


设x,y为做一次序列s产生的偏移量,f[i],h[i]为 序列s前缀i产生的偏移量.
若存在解 则 a=kx+f[i],b=ky+h[i]  k>=0 枚举i判定条件即可.

注意i==0特判还有dx和dy等于0的情况.

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5;ll a,b,dx=0,dy=0,f[N],h[N];char s[N];int main(){    cin>>a>>b;    scanf("%s",s+1);    int n=strlen(s+1);    for(int i=1;i<=n;i++)    {        if(s[i]=='R')            dx++;        if(s[i]=='L')            dx--;        if(s[i]=='U')            dy++;        if(s[i]=='D')            dy--;        f[i]=dx,h[i]=dy;    } //   cout<<dx<<' '<<dy<<endl;    bool flag=false;    for(int i=1;i<=n;i++)    {        ll k1,k2;        bool mk=true;        if(dx==0)        {            if(a!=f[i])                mk=false;        }        else        {            if((a-f[i])%dx)                mk=false;            else                k1=(a-f[i])/dx;        }        if(dy==0)        {            if(b!=h[i])                mk=false;        }        else        {            if((b-h[i])%dy)                mk=false;            else                k2=(b-h[i])/dy;        }        if(mk&&(dx==0||dy==0||k1==k2)&&(k1>=0&&k2>=0))            flag=true;//cout<<k1<<' '<<k2<<' '<<i<<endl;    }    //i==0    if(dx&&dy)    {        if(a%dx==0&&b%dy==0&&a/dx==b/dy&&a/dx>=0)            flag=true;    }    else if(dx==0&&dy)    {        if(a==0&&b%dy==0&&b/dy>=0)            flag=true;    }    else if(dx&&dy==0)    {        if(b==0&&a%dx==0&&a/dx>=0)            flag=true;    }    if(a==0&&b==0)        flag=true;    puts(flag?"Yes":"No");    return 0;}