1. 程式人生 > >Educational Codeforces Round 53C(二分,思維|構造)

Educational Codeforces Round 53C(二分,思維|構造)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int x[N],y[N];
int sx,sy,n;
char s[N];
bool check(int m)
{
    for(int i=1;i<=n-m+1;i++)
    {
        int tx=x[n]-x[i+m-1]+x[i-1];  //當前原來選項造成的橫座標影響
        int ty=y[n]-y[i+m-1]+y[i-1];  //當前原來選項造成的縱座標影響


        int ex=sx-tx, ey=sy-ty;        //消除當前影響
        if(m>=(abs(ex)+abs(ey)) && (m-abs(ex)-abs(ey))%2==0) //可以構造
            return 1;

    }
    return 0;
}
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    x[0]=y[0]=0;
    for(int i=1;i<=n;i++){
        x[i]=x[i-1];
        y[i]=y[i-1];  //累積前面步數的結果

        if(s[i]=='L')
            x[i]-=1;    //當前步數造成的影響
        else if(s[i]=='R')
            x[i]+=1;
        else if(s[i]=='D')
            y[i]-=1;
        else
        y[i]+=1;
    }
    scanf("%d %d",&sx,&sy);       //終點
    int l=0,r=n,ans=-1;
    while(l<=r){              //二分答案
        int mid=(l+r)>>1;
        if(check(mid))
            ans=mid,r=mid-1;
        else
            l=mid+1;
    }
    printf("%d\n",ans);
}
//待溫習