Título: Hay una arena con filas W y H. El robot va de (1,1) a (W, H). Hay un agujero negro rectangular en la arena con coordenadas superiores izquierdas (L, U) y coordenadas inferiores derechas (R, D).
El robot solo puede ir hacia la derecha o hacia abajo, con una probabilidad de 1/2. Si el robot está en la última fila, solo puede ir a la derecha; si el robot está en la última columna, solo puede bajar.
Pregúntele al robot la probabilidad de alcanzar con éxito (W, H) sin caer en el agujero negro.
Rango de datos:
1 ≤ T ≤ 100. 1 ≤ U ≤ D ≤ H. 1 ≤ L ≤ R ≤ W. 1 ≤ W ≤ 10 ^ 5. 1 ≤ H ≤ 10 ^ 5.
Análisis: El robot pasará desde la parte inferior izquierda del agujero negro o desde la parte superior derecha del agujero negro, con complejidad de tiempo O (n).
Nota: Debido a que "si el robot está en la última fila, solo puede ir a la derecha; si el robot está en la última columna, solo puede bajar", por lo que la probabilidad de la última fila y la última columna debe calcularse por separado.
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <iostream> #include <set> #include <map> #include <stack> #include <queue> #include <vector> #include <sstream> typedef long long LL; const int INF = 0x3f3f3f3f; usando el espacio de nombres estándar; const int MAXN = 200000 + 10; const doble eps = 1e-8; int dcmp (doble a, doble b) { if (fabs (a - b) <eps) devuelve 0; devolver a <b? -1: 1; } doble Log2 [MAXN], last_r [MAXN], last_c [MAXN]; int W, H, L, U, R, D; void init_log2 () { Log2 [0] = 0; para (int i = 1; i <MAXN; ++ i) { Log2 [i] = Log2 [i - 1] + log2 (i); } } void init_last () { last_r [1] = pow (2, Log2 [1 + H - 2] - Log2 [1 - 1] - Log2 [H - 1] - (doble) (1 + H - 2)) ; para (int i = 2; i <= W; ++ i) { last_r [i] = last_r [i - 1] + 0.5 * pow (2, Log2 [i + (H - 1) - 2] - Log2 [ i - 1] - Log2 [(H - 1) - 1] - (doble) (i + (H - 1) - 2)); } last_c [1] = pow (2, Log2 [W + 1 - 2] - Log2 [W - 1] - Log2 [1 - 1] - (doble) (W + 1 - 2)); para (int i = 2; i <= H; ++ i) { last_c [i] = last_c [i - 1] + 0.5 * pow (2, Log2 [(W - 1) + i - 2] - Log2 [ (W - 1) - 1] - Log2 [i - 1] - (doble) ((W - 1) + i - 2)); } } juez bool (int x, int y) { retorno x> = 1 && x <= W && y> = 1 && y <= H; } int main () { init_log2 (); int T; scanf ("% d", & T); para (int Caso = 1; Caso <= T; ++ Caso) { scanf ("% d% d% d% d% d% d", & W, & H, & L, & U, & R, & D); init_last (); int x = L - 1; int y = D + 1; doble ans = 0; while (juez (x, y)) { if (y == H) { ans + = last_r [x]; } else { ans + = pow (2, Log2 [x + y - 2] - Log2 [x - 1] - Log2 [y - 1] - (doble) (x + y - 2)); } ++ y; x = R + 1; y = U - 1; while (juez (x, y)) { if (x == W) { ans + = last_c [y]; } else { ans + = pow (2, Log2 [x + y - 2] - Log2 [x - 1] - Log2 [y - 1] - (doble) (x + y - 2)); } ++ x; --y; } printf ("Caso #% d:% .8lf \ n", Caso, ans); } devuelve 0; }