O significado de problemas
Dado um conjunto de comprimento n AR (n <= 2E5)
Este ar variedade perguntou quantas sub-matrizes são boa variedade
Sub-matriz é definida como:
A frente de uma matriz omitido ou todos os elementos de 0, seguido por 0 ou por exclusão de todos os elementos da matriz é obtido da sub- disposição matriz original
Boa disposição é definido como:
Para cada uma matriz soma subarray b satisfaz {b} ≠ 0
A matriz é uma boa matriz
Cada elemento da matriz para assegurar que o ABS (a [i]) <= 1E9
idéias de solução de problemas
Suponhamos que encontramos uma sub-matriz e o largo 0
Assim, desde que existam outros sub-matriz contém l, em seguida, esses sub-matrizes podem não ser chamado uma boa matriz
Então, estamos lidando com um elemento ar [i], basta olhar no ar [i] para a borda direita sub-array, r = i
I olhando para a esquerda a partir da posição inicial para uma paragem após uma sub-matriz e 0 para incluí-lo, de modo a este tempo deixou margem l
Em seguida, RL é a AR [i] é a fronteira direita da matriz bem número (incluindo a [R, R], não inclui [l, r])
Enquanto o caso de gravação de 1 a i neste intervalo, e sub-matrizes de 0 ao máximo esquerda fronteira Maxl para
Cada vez que a resposta mais i-Maxl
E, em seguida, para uma sub-gama 0 é determinado, e se não tivesse sido gravado prefixo Julgado
Por exemplo, [1, x], e como um, [1, Y] e também é um, mostra [x + 1, y] é 0, e esta matriz de peça
Uma vez que o prefixo e a distribuição de discreta, de modo utilização mapa / unordered_map para armazenamento
A complexidade global tempo é O (nlogn)
programa
mapa chave não aparecem no valor padrão é 0, pode ser usado para determinar se tinha havido um prefixo comum, e
Note-se que o início de um elemento não tem tempo para gravar o prefixo e 0, caso contrário, tem início no primeiro sub-matriz 1 e 0 não será julgada
Porque pode haver dois para formar sub-sies 0 e relações de inclusão (por exemplo, 11-1-1, [1,4], e [2,3], e 0), o que for maior, neste caso, se não for realizado Maxl não correspondem, como poderia, caso contrário Maxl 2, quando i = 4 é realizada a um valor pequeno substituído em Maxl = 1, e ideias
Finalmente, preste atenção a um inteiro longo
(186ms / 1500ms)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,int> mp;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
ll ar,sum=0,ans=0,maxL=1;
cin>>n;
mp[0]=1;//初始前缀和为0
for(int i=2;i<=n+1;i++)
{
cin>>ar;
sum+=ar;
if(mp[sum]!=0)
maxL=max(maxL,ll(mp[sum]+1)); //记得取大(否则wa8……)
ans+=i-maxL;//以i为右边界,满足题意的个数
mp[sum]=i;
}
cout<<ans<<'\n';
return 0;
}