Codeforces 1333C - Eugene e uma matriz (prefixo e)


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

Acho que você gosta

Origin www.cnblogs.com/stelayuri/p/12664224.html
Recomendado
Clasificación