CodeForces 1073C (二分答案)
阿新 • • 發佈:2018-12-23
任重而道遠
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); }