4.9 uma solução do problema diária para um problema

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

Acho que você gosta

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