AcWing 3956. Matriz truncada (suma de prefijo)

[Descripción del título]
Dada una longitud de nnn pares de númerosa 1 , a 2 , … , an a_1,a_2,…,a_na1,a2,,an.
Ahora, queremos truncar la matriz en el medio, lo que da como resultado tres subarreglos no vacíos.
Se requiere que las sumas de los elementos en los tres subarreglos sean iguales.
¿Cuántos métodos diferentes de truncamiento hay?

[Formato de entrada]
La primera línea contiene el número entero nnnorte _
La segunda línea contienennn enterosa 1 , a 2 , … , an a_1,a_2,…,a_na1,a2,,an

[Formato de salida]
Muestra un número entero, que indica el número de métodos de truncamiento.

[Rango de datos]
Los primeros seis puntos de prueba satisfacen 1 ≤ n ≤ 10 1≤n≤101norte10 _
Todos los puntos de prueba satisfacen1 ≤ n ≤ 1 0 5 1≤n≤10^51norte1 05− 10000 ≤ ai ≤ 10000 -10000≤a_i≤1000010000ayo10000 .

【Ejemplo de entrada 1】

4
1 2 3 3

【Muestra de salida 1】

1

【Ejemplo de entrada 2】

5
1 2 3 4 5

【Muestra de salida 2】

0

【Ejemplo de entrada 3】

2
0 0

【Ejemplo de salida 3】

0

【analizar】


Enumerar la posición jj de la segunda divisiónj , recuerda que la mitad derecha después de la división es[ j , n ] [j,n][ j ,n ] , luego sum [ j , n ] = sum [ 1 , n ] / 3 sum[j,n]=sum[1,n]/3 necesita sersatisfechosuma [ j , _ _norte ]=suma [ 1 , _ _n ] /3 , asumiendo que la posición de la primera división esiii , la mitad izquierda después de dividir es[ 1 , i ] [1,i][ 1 ,i ] , entonces debe satisfacer1 ≤ i ≤ j − 2 1\le i\le j-21ij2suma [ 1 , i ] = suma [ 1 , n ] / 3 suma[1,i]=suma[1,n]/3suma [ 1 , _ _yo ]=suma [ 1 , _ _n ] /3

Entonces podemos recordar el prefijo y la matriz como sss , enumere la posición de la segunda división y registre la primera división que satisfaga la condición (s [ i ] = s [ n ] / 3 s[i]=s[n]/3s [ yo ]=s [ n ] /3 ), cuando la segunda división es legal (( s [ n ] − s [ j − 1 ] ) = s [ n ] / 3 (s[n]-s[j-1]) =s [n]/3( s [ norte ]s [ j1 ])=s [ n ] /3 ), la respuesta se puede sumar al número de primeras divisiones que cumplen las condiciones.


【Código】

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;
const int N = 100010;
int s[N];
int n;

int main()
{
    
    
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> s[i], s[i] += s[i - 1];
    if (s[n] % 3)
    {
    
    
        cout << 0 << endl;
        return 0;
    }
    LL res = 0;
    for (int i = 3, cnt = 0; i <= n; i++)//枚举第二次截断的位置[i, n]
    {
    
    
        if (s[i - 2] == s[n] / 3) cnt++;
        if (s[n] - s[i - 1] == s[n] / 3) res += cnt;
    }
    cout << res << endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_51755720/article/details/129626714
Recomendado
Clasificación