4.9 una solución problema diario a un problema

Eugene y una matriz

La participación de puntos de conocimiento:

  • Doble puntero / prefijo y

solución:

  • \ (El significado de los problemas que se resumen simplemente para dar la matriz A, B le permiten encontrar toda la matriz, la matriz b necesidad de cumplir con dos condiciones: \)
  • \ (Condición 1, b matriz es una submatriz de la matriz (requerido continua) \)
  • \ (Condición 2, b submatriz de la matriz (requerido continua) no es igual a 0 y la suma \)
  • \ (N = 1e5, la violencia irresoluble \)
  • \ (Submatriz es porque continuo, suponiendo [1, x], y como, [1, y] y también es A, se nota [x + 1, y] es 0, y esta pieza matriz \)
  • $ De acuerdo con esta característica, el derecho de fijación de punto y, sólo podemos tomar el punto x + 2 izquierda, x + 3, 4 + x ...... y $
  • \ (Tomado porque si el punto x + 1 o menos izquierda, [x + 1, Y] matriz y esta pieza es 0, la condición no se satisface \)
  • \ (Lo que el enfoque es: O (n) para enumerar todos los puntos de la derecha, guardarla con un mapa y un prefijo, la máxima registrada en el punto izquierdo, actualizar la respuesta \)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn = 200005;
ll a[maxn],pre[maxn];
int main()
{
    int n , l = 0;
    ll ans = 0;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],pre[i] = pre[i-1] + a[i];
    map<ll , int > mp;
    mp[0] = 0;
    for(int i=1;i<=n;i++){
        if(mp[pre[i]] || pre[i] == 0)
            l = max(l , mp[pre[i]] + 1);
        ans += 1ll*(i - l);
        mp[pre[i]] = i;
    }
    cout<<ans<<endl;
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/QFNU-ACM/p/12666177.html
Recomendado
Clasificación