1. 程式人生 > >Codeforces1073C——Vasya and Robot

Codeforces1073C——Vasya and Robot

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f;
int n,x,y;
char s[N];
int pre[N][2];
bool check(int m){
    for(int i=1;i+m-1<=n;i++){
        //xx yy是整個序列減去中間修改部分剩下的序列所對應的x和y
        int xx=pre[n][0]-pre[i+m-1][0]+pre[i-1][0];
        int yy=pre[n]
[1]-pre[i+m-1][1]+pre[i-1][1]; //tx ty是要修改的區間修改後應該對應的x和y int tx=x-xx; int ty=y-yy; //如果區間長度m大於等於|tx|+|ty|而且m減去|tx|+|ty|剩下的是偶數的話,就可以把這些剩下的相互低效,然後其他就一直往一個方向走即達到目標 if(abs(tx)+abs(ty)<=m &&(m-abs(tx)-abs(ty))%2==0){ return true; } } return
false; } int main(void){ //freopen("data.txt","r",stdin); scanf("%d",&n); scanf("%s",s+1); scanf("%d%d",&x,&y); //預處理字首和 pre[i][0]代表x pre[i][1]代表y 比如RU 到R的位置x=1 y=0 到U的時候x=1 y=1 pre[0][0]=0; pre[0][1]=0; for(int i=1;i<=n;i++){ pre[i][0]=pre[i-1][0]; pre[
i][1]=pre[i-1][1]; if(s[i]=='U'){ pre[i][1]++; } else if(s[i]=='D'){ pre[i][1]--; } else if(s[i]=='L'){ pre[i][0]--; } else{ pre[i][0]++; } } //二分答案(區間長度) int l=0,r=n; int m; int ans=INF; while(l<=r){ m=(l+r)>>1; if(check(m)){ r=m-1; //ans=min(ans,m); ans=m; } else{ l=m+1; } } if(ans==INF){ printf("-1\n"); return 0; } printf("%d\n",ans); return 0; }