【Digital dp + como presión】 XHXJ's LIS

Titulo

define xhxj (hermana mayor de Xin Hang (学 姐)) Si no sabes xhxj, entonces leer cuidadosamente la descripción completa es muy importante. Como la fuerza de combate más fuerte en UESTC, xhxj creció en Jintang, una ciudad fronteriza de Chengdu. 
 
Al igual que muchos ganadores de Dios, xhxj tiene una vida legendaria: 2010.04, aún no había comenzado a aprender el algoritmo, xhxj ganó el segundo premio en el concurso universitario. Y en este otoño, xhxj obtuvo una medalla de oro y una medalla de plata de concurso regional. En el verano del año próximo, xhxj fue invitado a Beijing para asistir al astar en el lugar. Unos meses más tarde, xhxj obtuvo dos medallas de oro y también se clasificó para la final mundial. Sin embargo, xhxj fue derrotado por zhymaoiing en la competencia que determinó quién iría a la final del mundo (solo hay un equipo para que cada universidad envíe a la final del mundo). Ahora, xhxj es mucho más fuerte que nunca, y ella irá al país soñado para competir en la final del TCO. Como ves, xhxj siempre tiene el pelo corto (razones desconocidas), por lo que parece un niño (no te diré que en realidad es una chica encantadora), vistiendo una camiseta amarilla. Cuando no está hablando, su rostro redondo se siente muy encantador, atrayendo a otros a tocar su rostro suavemente. A diferencia de Dios Luo, otro ganado de Dios UESTC que tiene un encanto fresco y noble, xhxj es bastante accesible, alegre, inteligente. Por otro lado, xhxj es muy sensible a las hermosas propiedades, "este problema tiene muy buenas propiedades", ella siempre dijo que después de resolver un problema muy difícil. A menudo ayuda a encontrar soluciones, aunque no es buena en los problemas de ese tipo. 
Xhxj ama muchos juegos como Dota, ocg, mahjong, Starcraft 2, Diablo 3.etc, si puedes vencerla en cualquiera de los juegos anteriores, la admirarás y te convertirás en un dios ganado. Está muy preocupada por sus compañeros de escuela más jóvenes, si veía a alguien en una plataforma DOTA, diría: "¿Por qué no vas a mejorar tu habilidad de programación?". Cuando recibe sinceros elogios de otros, ella decía con modestia: "Por favor, no me halagues. (Por favor, no te pongas negro)". Como se graduará después de no más de un año, xhxj también quiere enamorarse. Sin embargo, el hombre en sus sueños aún no ha aparecido, por lo que ahora prefiere chicas. Otro pasatiempo de xhxj es yy (especulación) algunos problemas mágicos para descubrir las propiedades especiales. Por ejemplo, cuando ve un número, piensa si los dígitos de un número están aumentando estrictamente. Si considera el número como una cadena y puede obtener una subsecuencia estrictamente más larga cuya longitud es igual a k, la potencia de este número es k .. Es muy simple determinar la potencia de un solo número, pero también es fácil para resolver este problema con los números dentro de un intervalo? xhxj está un poco cansada, quiere que un dios ganado le ayude a resolver este problema, el problema es: Determine cuántos números tienen el valor de potencia k en [L, R] en O (1) tiempo. Para el primero en resolver este problema, xhxj actualizará 20 tasa de favorabilidad 20 ¿Pero también es fácil resolver este problema con los números dentro de un intervalo? xhxj está un poco cansada, quiere que un dios ganado le ayude a resolver este problema, el problema es: Determine cuántos números tienen el valor de potencia k en [L, R] en O (1) tiempo. Para el primero en resolver este problema, xhxj actualizará 20 tasa de favorabilidad 20 ¿Pero también es fácil resolver este problema con los números dentro de un intervalo? xhxj está un poco cansada, quiere que un dios ganado le ayude a resolver este problema, el problema es: Determine cuántos números tienen el valor de potencia k en [L, R] en O (1) tiempo. Para el primero en resolver este problema, xhxj actualizará 20 tasa de favorabilidad 20

Entrada

Primero un entero T (T <= 10000), luego siguen las líneas T, cada línea tiene tres enteros positivos L, R, K. (0 <L <= R <2 63-1 y 1 <= K <= 10).

Salida

Para cada consulta, imprima "Caso #t: ans" en una línea, en la cual t es el número del caso de prueba a partir de 1 y ans es la respuesta.

Entrada de muestra

1
123 321 2

Salida de muestra

Caso # 1: 139

Análisis

El significado aproximado del título es permitirle contar la cantidad de números que cumplen con los requisitos dentro de un intervalo dado. Un número si su longitud de subsecuencia ascendente más larga de cada dígito es k, entonces cumple con los requisitos. Esta pregunta se divide en tres puntos.
1. En primer lugar, esta pregunta es coherente con la resta de intervalos: solo necesitamos preguntar el número de números legales 0 ~ 1-1 y 0 ~ r, y luego hacer la resta. 2. El procesamiento de LIS Utilizamos compresión de estado para tratar la presión de LIS: la posición del i-ésimo 1 en el binario de este número representa el valor mínimo del último bit del LIS con la longitud de secuencia actual i Entonces, el número de 1 es la actualización del estado de longitud de LIS : suponga que el estado actual es 0100100110, la secuencia más larga es 1 4 7 8, si nuestro próximo valor de bit dp es 6, entonces la subsecuencia ascendente de longitud 3 se cambia 1 4 7 se convierte en 1 4 6. En consecuencia, nuestro estado actualizado es 0100101010, que es equivalente a 6 reemplazando 7 en binario. Entonces la búsqueda profunda ha terminado de nuevo. 


Código

#include <bits / stdc ++. h>
 usando el  espacio de nombres std;
largo  largo dp [ 25 ] [ 1 << 10 ] [ 11 ];
int k, bit [ 25 ];
int ne ( int x, int s) {
     for ( int i = x; i < 10 ; ++ i)
     if (s & 1 << i) return (s ^ ( 1 << i) | ( 1 << x) );
    devuelve s | ( 1 << x); 
} 
intnum ( int s) {
     int ret = 0 ;
    while (s) {
         if (s & 1 ) 
        ret ++ ; 
        s >> = 1 ; 
    } 
    return ret; 
} 
long  long dfs ( int pos, int s, bool e, bool z) {
     if (pos == - 1 ) return num (s) == k;
    if (! e && dp [pos] [s] [k]! = - 1 ) returndp [pos] [s] [k];
    largo  largo ans = 0 ;
    int endd = e? bit [pos]: 9 ;
    para ( int i = 0 ; i <= endd; ++ i) 
    ans + = dfs (pos- 1 , (z && i == 0 )? 0 : ne (i, s), e && i == endd, z && (i = = 0 ));
    if (! e) dp [pos] [s] [k] = ans;
    volver ans; 
} 
long  long ca ( long  long n) {
     int len = 0 ;
    mientras que (n) {
        bit [len ++] = n% 10 ; 
        n / = 10 ; 
    } 
    return dfs (len- 1 , 0 , 1 , 1 ); 
} 
int main () {
     int t;
    largo  largo l, r; 
    memset (dp, - 1 , sizeof dp); 
    scanf ( " % d " , & t);
    int casee = 0 ;
    while (t-- ) { 
        scanf ( " % I64d% I64d% d ", & l, & r, & k); 
        printf ( " Caso #% d: " , ++ casee); 
        printf ( " % I64d \ n " , ca (r) -ca (l- 1 )); 
    } 
    devuelve  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/Vocanda/p/12753323.html
Recomendado
Clasificación