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;
}