Questa è una domanda dell'APAC di Google 2017. Problem D: Sum of SumTrova la somma di una serie di sottoarray
Alice presentato il suo amico Bob con una serie di N interi positivi, indicizzato da 1 a N. Ha sfidato Bob con molte query del tipo "Qual è la somma dei numeri tra questi due indici?" Ma Bob è stato in grado di risolvere il problema troppo facilmente. Alice ha preso il suo array e ha trovato tutti i sottotitoli non N * (N + 1)/2 non vuoti di esso. Ha trovato la somma di ciascun subarray e quindi ha ordinato questi valori (in ordine non crescente) per creare un nuovo array, indicizzato da 1 a N * (N + 1)/2. Ad esempio, per un array iniziale [2, 3, 2], Alice genera i sottoarray [2], [3], [2], [2, 3], [3, 2] e [2, 3, 2] (nota che [2, 2], ad esempio, NON è un sottoarray). Poi prendeva le somme - 2, 3, 2, 5, 5, 7 - e le ordinava per ottenere una nuova serie di [2, 3, 5, 5, 7]. Alice ha dato l'iniziale array a Bob, insieme alle query Q del modulo "qual è la somma dei numeri dall'indice Li a Ri, incluso, nel nuovo array?" Ora Bob è nei guai! Puoi aiutarlo?
La soluzione semplice è troppo inefficiente anche in C++ per set di dati di grandi dimensioni. C'è un modo più efficiente per risolvere questo?
Attualmente sto attraversando questo ciclo for per costruire la serie finale:
multiset<int> sums;
long long int temp = 0;
for (long long int len = 1; len <= n; ++len)
{
for (int start = 0; start+len <= n; ++start)
{
temp = 0;
for (int i = 0; i < len; ++i)
{
temp += arr[start + i]; //arr stores the original array of n digits
}
sums.insert(temp);
}
}
P.S: E 'il mio attuale implementazione O (n^5)?
Il mio errore, posso vedere come la sua O (n^3) ora. Grazie Modifica: le risposte finora sono state utili ma con dataset di grandi dimensioni che coinvolgono n = 200000 elementi, sembra che qualsiasi soluzione che calcoli l'intero array di subarray sia troppo costosa. Tutte le soluzioni inviate non sembrano calcolare l'intera gamma di sottoarray
come si arriva con O (n^5)? Vedo solo 3 loop – user463035818
Non so cosa intendi con 'O (n^5)', ma la soluzione semplice verrà eseguita in 'O (T * Q * N^2 * logN)'. –
Secondo il tuo codice. L'ottimizzazione semplice è che è possibile precalcolare somme di prefissi e calcolare la somma del sommario in O (1). –