Educational Codeforces Round 53C(二分,思維|構造)
阿新 • • 發佈:2018-11-11
#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);
}
//待溫習