la solución del problema Luo Gu --P1114: "mismos hombres y mujeres" programa de

temas relacionados

tema Enlace

Luo Valley, https://www.luogu.com.cn/problem/P1114 .

ajo pasajero Total, https://nanti.jisuanke.com/t/T1853 .

Mi DO, http://47.110.135.197/problem.php?id=5252 .

título Descripción

Recientemente, el comienzo de un año de XXXlos niños que trabajan en el problema de la concordancia (piensa demasiado, sólo bailar pareja) compañeros de clase a través de varios experimentos y el razonamiento, llegó a dominar una gran cantidad de experiencia de combate real. Por ejemplo, Según su observación, la misma altura que parece ser más sociable.

Halloween se aproxima, XXXlisto para planificar un gran escala "muy hombres y mujeres" actividades encontradas en las escuelas. Para los participantes del evento, XXXque tienen su propio método único de elección. Se espera que para seleccionar un número igual de hombres y mujeres y algunas personas son de altura y cerca. Para implementar esta elección es muy sencilla. Dejó que todas las escuelas de acuerdo a la altura de una fila, y después elegir entre varias individuales consecutivos, por lo que estas personas son iguales cantidades de hombres y mujeres. Para hacer el evento más divertido, XXXpor supuesto, la esperanza de que él elegirá a tantas personas como sea posible. Por favor, escriba un programa para decirle que él puede elegir el número máximo de personas.

Formato de entrada

La primera línea hay un número entero positivo n, el número de representantes de la escuela. n ≤ 100000

La segunda fila tiene n números separados por un espacio, estos números sólo pueden ser 0 o 1, en donde 0 representa una chica, representa un niño.

Formato de salida

Salida de un número entero no negativo. Este número indica el más largo en la secuencia de datos de entrada de longitud igual al período de machos y hembras.

Si no existe la secuencia número igual de hombres y mujeres, la salida 0.

Ejemplo de entrada

9
0 1 0 0 0 1 1 0 0

Ejemplo de salida

6

tema de análisis

El análisis del significado de problemas

Encontrar el número de longitud n de columnas, la secuencia más larga [l, r], secuencia que comprende el mismo número de 1 y 0. ¿Qué significa esto? Que pensamos. array matriz 0 y 1 solo dos clases. Supongamos [l, r] elementos X tienen antes, entonces el  \ Sum_ {i = l} ^ {r} a_i valor debe ser la cantidad de? Inteligente que no se piensa inmediatamente, y esto debe ser  \ Frac {x} {2}. Ahora se debe reflejar, en primer lugar tenemos que calcular y prefijo.

análisis de los datos de la muestra

Los datos de muestra de entrada es [010 001 100], y después el prefijo correspondiente es [0011112333]. Porque queremos las mismas preguntas que los niños y niñas, significa que el resultado debe ser un número par. Nueve datos de ejemplo, la longitud máxima de solamente 8. 2,4,6,8 idea es que si podemos encontrar una subsecuencia. Vamos a dibujar una tabla para simular lo que el proceso de violencia de cálculo.

l r Número de personas I [R] -sum [i-1] En línea? observación
2 9 8 3-0 = 3  
1 8 8 3-0 = 3  
4 9 6 3-1 = 2  
3 8 6 3-1 = 2  
2 7 6 3-0 = 3 6 puede que no necesite para verificar la composición 4

Como se muestra en la tabla anterior, la secuencia final más larga 6.

Gama de análisis de datos

De acuerdo con datos proporcionados por el alcance del tema, podemos saber el valor máximo de n es 10000, por lo que la  O (n ^ {2}) complejidad del algoritmo es otra forma de pasar. Debido a la pequeña cantidad de datos, podemos restar palos, refiriéndose a la idea anterior, apenas pueda. De acuerdo con el principio más desfavorable, podemos saber que se cambia la complejidad del algoritmo  O (\ frac {1} {2} n ^ {2})(en realidad no hay tal complejidad).

algoritmo de optimización

¿Puede el anterior O (nlogn) algoritmo de optimización es O (n)?

Necesitamos un simple procesamiento de los datos en bruto. Los datos originales, 0 está representado por niñas, los niños indicados por 1, a la que vamos a simétrico, es decir, representados por -1 niñas, los niños representan por 1, siempre que el par de niños y niñas, y la correspondiente cero. También se analizaron usando los siguientes datos de ejemplo:

No. 1 2 3 4 5 6 7 8 9
Los datos en bruto 0 1 0 0 0 1 1 0 0
los datos modificados -1 1 -1 -1 -1 1 1 -1 -1
prefijo y -1 0 -1 -2 -3 -2 -1 -2 -3

Después de que se modifican los datos, se supone [l, r] x tienen elementos antes, si el número de niños y niñas tanto como este se une \ Sum_ {i = l} ^ {r} a_i, es decir, suma [r] = suma [l -1].

Por lo tanto, también se calculó el prefijo y establecer una tabla de dispersión, como se muestra anteriormente, podemos obtener la siguiente tabla hash.

Como se muestra arriba, la primera columna del valor de datos es una tabla hash, la parte posterior valor hash para el prefijo y el índice correspondiente. Podemos ver la siguiente información:

1, sólo un prefijo y de datos es 0, y por lo tanto sin duda no compuestas de hombres y mujeres en conjunto.

2, hay tres prefijos, y los datos se -1, y los prefijos subíndice mínimo 1, máximo prefijo y el índice de 7, 6 indica una combinación de individuos masculinos y femeninos pueden estar compuestos, es decir, los datos originales subíndice 2 a 7, que corresponde a 1 00011, que está a 3 hombres y 3 mujeres.

3, hay tres prefijos, y los datos se -2, los prefijos más pequeños subíndice y 4, y la prefijos subíndice máximo de 8, 4 indica una combinación de individuos masculinos y femeninos puede estar compuesto, es decir, el índice de matriz de datos original 5 a 8, que corresponde a 0 110, que es de 2 hombres y 2 mujeres.

4, hay dos prefijos, y -3 datos, el prefijo y el índice mínimo de 5, y el subíndice prefijos máximo 9, 4 indica una combinación de individuos masculinos y femeninos puede estar compuesto, es decir, los datos originales subíndice de matriz 6 a 9, corresponde a 1100, que está a 2 hombres y 2 mujeres.

código de referencia AC

reducción de la violencia logrado palos

Si la cantidad de datos excede 1E5, que se estima que este algoritmo es impotente. Para llegar a la parte TLE.

#include <cstdio>
using namespace std;

const int MAXN = 1e5+4;
int nums[MAXN];//原始数据
int qzh[MAXN];//前缀和

int main() {
    int n;
    scanf("%d", &n);

    for (int i=1; i<=n; i++) {
        scanf("%d", &nums[i]);
        qzh[i] = qzh[i-1]+nums[i];
    }

    /*
    i表示构造长度
    j表示起点
     */
    int m= (1==n%2) ? n-1 : n;
    for (int i=m; i>=2; i-=2) {
        //n,n/2,n/4,...,4,2 的长度进行验证
        for (int j=n; j-i>=0; j--) {
            if ((qzh[j]-qzh[j-i])*2==i) {
                printf("%d\n", i);
                return 0;
            }
        }
    }
    printf("0\n");

    return 0;
}

algoritmo de optimización

Sabemos que el unordered_map interno consigue utilizando una tabla hash, por lo que podemos utilizar este tipo de STL.

#include <cstdio>
#include <unordered_map>

using namespace std;

const int MAXN = 1e5+4;
int nums[MAXN];//前缀和

int main() {
    int n;
    scanf("%d", &n);

    unordered_map<int, int> hash;
    hash[0] = 0;//特例处理
    int ans = 0;
    for (int i=1; i<=n; i++) {
        scanf("%d", &nums[i]);
        if (0==nums[i]) {
            nums[i] = -1;
        }
        nums[i] += nums[i-1];//构造前缀和

        if (hash.find(nums[i]) == hash.end()) {
            //第一次出现,增加到哈希表中
            hash[nums[i]] = i;
        } else if (i-hash[nums[i]]>0 && i-hash[nums[i]]>ans) {
            //出现过
            ans = i-hash[nums[i]];
        }
    }

    printf("%d\n", ans);

    return 0;
}

Utilice unordered_map, prestar atención a algunos ejemplos específicos. Si la entrada es

4
1 0 0 1

 

 

Publicados 235 artículos originales · ganado elogios 289 · Vistas 1,07 millones +

Supongo que te gusta

Origin blog.csdn.net/justidle/article/details/104848187
Recomendado
Clasificación