在一个无限大的二维平面上有一个机器人。
初始时,机器人位于点 (0,0)(0,0)。
机器人可以执行四种行动指令:
-
U
— 从 (x,y)(x,y) 移动到 (x,y+1)(x,y+1); -
D
— 从 (x,y)(x,y) 移动到 (x,y−1)(x,y−1); -
L
— 从 (x,y)(x,y) 移动到 (x−1,y)(x−1,y); -
R
— 从 (x,y)(x,y) 移动到 (x+1,y)(x+1,y)。
给定一个长度为 nn 的指令序列,指令编号 1∼n1∼n,机器人将按顺序依次执行序列中的每个行动指令。
我们希望机器人最终抵达目标地点 (a,b)(a,b)。
为了达成这一目的,我们可能需要对指令序列进行修改。
每次修改可以选择其中一个指令,并将其替换为四种指令之一。
注意,只能对序列中的指令进行替换,不得随意删除指令或添加额外指令。
不妨设经过修改的指令中,编号最小的指令编号为 minIDminID,编号最大的指令编号为 maxIDmaxID。
我们定义修改成本为 maxID−minID+1maxID−minID+1。
例如,将 RRRRRRR
修改为 RLRRLRL
,则编号为 2,5,72,5,7 的指令经过了修改,修改成本为 7−2+1=67−2+1=6。
请你计算,为了使得机器人能够最终抵达目标点 (a,b)(a,b),所需花费的最小修改成本。
如果不需要对序列进行修改,则成本为 00。
输入格式
第一行包含整数 nn。
第二行包含一个长度为 nn 的字符串,表示指令序列,字符串中只包含 U
,D
,L
,R
。
第三行包含两个整数 a,ba,b,表示机器人的目标位置为 (a,b)(a,b)。
输出格式
输出一个整数,表示最小修改成本。
如果无论如何修改,机器人都无法抵达目标位置,则输出 −1−1。
数据范围
前四个测试点满足 1≤n≤101≤n≤10。
所有测试点满足 1≤n≤2×1051≤n≤2×105,−109≤x,y≤109−109≤x,y≤109。
输入样例1:
5
RURUU
-2 3
输出样例1:
3
输入样例2:
4
RULR
1 1
输出样例2:
0
输入样例3:
3
UUU
100 100
输出样例3:
-1
1 二分答案o(nlogn) 2 枚举所有mid区间,前缀和记录除去mid区间的影响使得机器人到达,xi,yi; 3 等价判断xi,yi能否改至多mid次操作到达sx,sy; 4 不难发现与哈密尔顿距离d有关,如果哈密尔顿距离大于mid无论证明改都不可能到达,同时还要满足哈密尔顿距离与mid大小同奇偶,因为只要同奇偶,且哈密尔顿距离满足要求,则可以利用对称走法互相抵消; 5 #include<bits/stdc++.h> 6 using namespace std; 7 const int N=2e5+5; 8 int sx[N],sy[N],n,tx,ty; 9 10 int check(int i,int j) 11 { 12 int len=j-i+1; 13 int x=sx[n]-(sx[j]-sx[i-1]); 14 int y=sy[n]-(sy[j]-sy[i-1]); 15 int d=abs(x-tx)+abs(y-ty); 16 if(len>=d&&((d-len)%2==0))return 1; 17 return 0; 18 } 19 int main() 20 { 21 22 cin>>n; 23 string s; 24 cin>>s; 25 cin>>tx>>ty; 26 if(abs(ty)+abs(tx)>n||(tx+ty-n)&1)puts("-1"); 27 else 28 { 29 for(int i=1;i<=n;i++) 30 { 31 sx[i]=sx[i-1]; 32 sy[i]=sy[i-1]; 33 if(s[i-1]=='R')sx[i]++; 34 else if(s[i-1]=='L')sx[i]--; 35 else if(s[i-1]=='U')sy[i]++; 36 else sy[i]--; 37 } 38 int l=0,r=n; 39 while(l<=r) 40 { 41 int mid=(l+r)>>1; 42 bool ok=false; 43 for(int i=1;i+mid-1<=n;i++) 44 { 45 int j=i+mid-1; 46 if(check(i,j)) 47 { 48 ok=true; 49 break; 50 } 51 } 52 if(ok)r=mid-1; 53 else l=mid+1; 54 } 55 cout<<l<<endl; 56 } 57 58 return 0; 59 }