Eugene e uma matriz
Envolvendo pontos de conhecimento:
- Duplo ponteiro / e prefixo
solução:
- \ (O significado dos problemas simplesmente resumidas como para dar a matriz a, b deixar você encontrar toda a matriz, a matriz b necessidade de cumprir duas condições: \)
- \ (Condição 1, b matriz é uma sub-disposição de matriz (necessária contínua) \)
- \ (Condição 2, b subarray da matriz (necessária contínua) não é igual a 0 e a soma \)
- \ (N = 1e5, violência insolúvel \)
- \ (Subarray é porque contínua, assumindo [1, X], e como um, [1, Y] e também é um, mostra [x + 1, y] é 0, e esta matriz de peça \)
- $ De acordo com esse recurso, o direito de fixação ponto y, só podemos tomar o ponto esquerdo x + 2, x + 3, x + 4 ...... y $
- \ (Tomado porque se o ponto x + 1 ou inferior esquerda, [x + 1, Y] matriz e esta peça é 0, a condição não é satisfeita \)
- \ (Portanto, a abordagem é: O (n) para enumerar todos os pontos direita, salve-o com um mapa e um prefixo, a máxima registada, o ponto esquerdo, atualizar a resposta \)
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;
}