2015-10-06 16 views
5

Ho un array di dimensione N e ho dato 2 tipi di interrogazioneinverte una query matrice

1 LR Reverse elemento tutti da [L, R]
2 L Trovare il valore di indice L.

Example: [1,2,3,4,5] 
1 2 4 -> [1,4,3,2,5] 
1 4 5 -> [1,4,3,5,2] 
2 5 -> 2 

Q -Numero di Query
Q < = 10^5 e N < = 10^5
Straight Forward soluzione b e O (Q * N) che sarà abbastanza lento, come renderlo più veloce può essere utilizzato l'albero del segmento?

+0

Sì. L'albero del segmento è la soluzione al problema. – vish4071

+0

@ vish4071 esattamente come? potresti pubblicare una risposta? :) – svs

+0

@ vish4071 puoi spiegare come usare l'albero del segmento in questo –

risposta

3

Non sono sicuro dell'aspetto dell'algoritmo dell'albero del segmento.

Questo può essere fatto nel tempo O ((n + q) log n) utilizzando alberi di diffusione decorati. Ogni decorazione del nodo consiste in un conteggio discendente e un bit che, se impostato, inverte implicitamente l'intera struttura secondaria. Per eseguire una query, utilizzare i conteggi dei discendenti per navigare nel nodo appropriato. Per invertire da u a v, splay u alla radice, staccare suo sottoalbero sinistro u.L, splay v alla radice, staccare suo sottoalbero destro v.R, invertire i bit vibrazione su tutte u.L, v, v.R, ricollegare u.L al campo da quale v.R è venuto, splay u, ricollegare lo v.R allo stesso modo.

Key: ? denotes an anonymous node 
    ^denotes a subtree 


    u 
/\ 
u.L ? 
^/\ 
    v ? 
^^


u.L v 
^ /\ 
    u v.R 
     \^
     ? 
    ^


v.R v  # v's flip bit is inverted 
^ /\ 
    u u.L # so is u.L's, for no effect on u.L 
     \^
     ? 
    ^


    u 
/\ 
v.R v 
^/\ 
    ? u.L 
^^
+0

1) scusa, ma come si esegue esattamente il secondo tipo di query? non posso vederlo. 2) memorizzi l'indice di un elemento nel nodo dell'albero? 3) per "decorato" intendi dire aumentato, il che significa che memorizza informazioni aggiuntive diverse dal bambino sinistro, destro? 4) conosci applicazioni simili di alberi splay? sembrano uno strumento molto potente – svs

+1

@svs 1. Aggiunto un diagramma. 2. Sì, ogni nodo contiene un valore di dati. 3. Sì. 4. Ci sono un sacco di applicazioni nel documento originale di Sleator - Tarjan. –

+0

quello che non capisco è il motivo per cui finiamo con 'u.R' essere il figlio sinistro di 'u'. Trovo il problema nel seguente: cerchiamo qualcosa con indice inferiore a 'u', diciamo' p u', ma volevamo' p svs