标签:desc solution main 包含 lse char s 最小 script sig
在平面直角坐标系中,一个机器人处于 $ (0,0) $ 点。它能进行以下的移动操作。$ U~~ $ 从 $ (x,y) $ 移动到 $ (x,y+1) \(;\) D~~ $ 从 $ (x,y) $ 移动到 $ (x,y-1) \(;\) L~~ $ 从 $ (x,y) $ 移动到 $ (x-1,y) \(;\) R~~ $ 从 $ (x,y) $ 移动到 $ (x+1,y) $。现在有一个长度为 $ n $ 的操作序列。Vasya想修改这个序列使机器人最终移动到 $ (x,y) $。其修改的花费为 $ maxID-minID+1 \(。\) maxID $ 是修改的操作的下标的最大值,$ minID $ 是修改的操作的下标的最小值。如果没有修改,则花费为 $ 0 $。
考虑到对于一个区间,如果它可行,那么一个包含它的区间一定可行
故尺取法即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,x,y,ans=1e9;
char s[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n>>s+1>>x>>y;
if((abs(x)+abs(y))%2!=n%2) {
cout<<-1;
return 0;
}
int j=1;
for(int i=1;i<=n;i++) {
if(s[i]==‘U‘) y--;
if(s[i]==‘D‘) y++;
if(s[i]==‘L‘) x++;
if(s[i]==‘R‘) x--;
}
for(int i=0;i<=n;i++) {
if(s[i]==‘U‘) y--;
if(s[i]==‘D‘) y++;
if(s[i]==‘L‘) x++;
if(s[i]==‘R‘) x--;
j=max(j,i+1);
while(j<=n && abs(x)+abs(y)>j-i-1) {
if(s[j]==‘U‘) y++;
if(s[j]==‘D‘) y--;
if(s[j]==‘L‘) x--;
if(s[j]==‘R‘) x++;
++j;
}
//cout<<i<<" "<<j<<endl;
if(abs(x)+abs(y)<=j-i-1) ans=min(ans,j-i-1);
}
cout<<(ans>1e8?-1:ans);
}
[CF1073C] Vasya and Robot - 尺取法
标签:desc solution main 包含 lse char s 最小 script sig
原文地址:https://www.cnblogs.com/mollnn/p/12838806.html