1. 程式人生 > >CodeForces 1073C (二分答案)

CodeForces 1073C (二分答案)

任重而道遠

AC程式碼:

#pragma optimize GCC ("O2")
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
char s[N];
int n, p, q, x[N], y[N];

int read () {
	int x = 0, f = 0; char c = getchar ();
	while (!isdigit (c)) f |= (c == '-'), c = getchar ();
	while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
	return f ? -x : x;
}

void init () {
	int a = 0, b = 0;
	for (int i = 1; i <= n; i++) {
		if (s[i] == 'U') b += 1;
		if (s[i] == 'D') b -= 1;
		if (s[i] == 'L') a -= 1;
		if (s[i] == 'R') a += 1;
		x[i] = a, y[i] = b;
	}
}

bool check (int len) {
	for (int i = 1; i + len - 1 <= n; i++) {
		int dx = p - (x[i - 1] + x[n] - x[i + len - 1]), dy = q - (y[i - 1] + y[n] - y[i + len - 1]);
		int delta = abs (dx) + abs (dy);
		if (len >= delta && !((len - delta) & 1)) return true;
	}
	return false;
}

int main () {
	n = read ();
	scanf ("%s", s + 1);
	p = read (), q = read ();
	if (abs (p) + abs (q) > n || (n - abs (p) - abs (q)) & 1) return puts ("-1");
	init ();
	int lf = 0, rg = n;
	while (lf <= rg) {
		int mid = lf + rg >> 1;
		if (check (mid)) rg = mid - 1;
		else lf = mid + 1;
	}
	return !printf ("%d\n", lf);
}