CF 1073C. Vasya and Robot(二分)

版权声明:本文为博主原创文章,转载请在下面留个言就好 https://blog.csdn.net/Dylan_Frank/article/details/83450329

题目链接

C. Vasya and Robot

题目分析

二分,之前想多了,想成两个方向没有关系了,其实因为题目没有问怎么更改,可是我们可以想一下,我们判断它无法到达的根据

n < a b s ( x ) + a b s ( y ) ( n a b s ( x ) a b s ( y ) ) % 2 = = 1 n < abs(x) + abs(y) || (n - abs(x) - abs(y))\%2 ==1

因此只要任意两个点之间的绝对值差要小于字符的长度都是可以办到的

code

#include<bits/stdc++.h>
using namespace std;

#define MAX_VAL         1000005
#define MAX_ARRAY_SIZE  200005
#define ms(x,v)         memset((x),(v),sizeof(x))
#define pb              push_back
#define fi              first
#define se              second
#define mp              make_pair
#define INF             0x3f3f3f3f


typedef long long LL;
typedef pair<int,int> Pair;

int n;
char s[MAX_ARRAY_SIZE];
int x,y;
int dx[MAX_ARRAY_SIZE];
int dy[MAX_ARRAY_SIZE];

int solve(int l){
	int left = l-1 ,right = n+1;
	while (left <= right) {
		int mid = (left + right) >>1;
		int X = dx[n] -(dx[mid] - dx[l-1]),Y = dy[n] - (dy[mid] - dy[l-1]);
		if(abs(X - x) + abs(Y - y) <= mid - l+1)right= mid -1;
		else left = mid +1;
	}
	return right +1;
}
int main (int argc, char const *argv[]) {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

	cin >> n >> (s+1) >> x >> y;
	if(abs(x) + abs(y) > n || (n - (abs(x)+abs(y))) %2 !=0){
		std::cout << "-1" << '\n';
		return 0;
	}
	dy[0] = dx[0] =0;
	dy[n+1] = dx[n+1] = INF;
	for(int i=1 ; i <=n ; ++i){
		dx[i] = dx[i-1] +(s[i] =='R'?1 : (s[i]=='L'?-1 :0) );
		dy[i] = dy[i-1] +(s[i] =='U'?1 : (s[i] == 'D'? -1 :0));
	}
	int ans = INF;
	for(int i=1 ;i<=n ; ++i){
		int last = solve(i);
		if(last <=n)ans = min(ans , last - i +1);
	}
	std::cout << ans << '\n';
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dylan_Frank/article/details/83450329