Estruturas de dados
Estruturas de dados
Estrutura de dados é o ramo da computação que estuda os diversos mecanismos de organização de dados para atender aos diferentes requisitos de processamento.
Exemplos:
Pilha, Fila, Lista encadeada, Árvores binárias, Heap, DSU
BIT, Segment tree, Treap, Sparse table
BIT (Binary Indexed Tree)
- BIT sempre tem a operação soma
Bit menos significativo
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Obter soma até determinada posição
-
Adicionar em um ponto e consultar em range (point update/range query)
-
Adicinar em range e consultar um ponto (point query/range update)
(Ideia da soma de prefixos)
Somar x no intervalo de l até r:
add(l, x);
add(r+1, -x);
Consultar valor na posição p:
query§;
Segment Tree
- point update/range query
- range update/point query
- range update/range query
Operações
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
pai -> filho1: 2*pai
filho2: 2*pai +1
1 -> 2 -> 4 -> 8
-> 9
-> 5 -> 10
-> 11
3 -> 6
-> 7
v = {1, 3, 2, 10, 7, 8}
atualização: soma v no intervalo de i até j
consulta: qual o máximo valor no intervalo de i a j
segment tree maximo
int st[4*N];
int lz[4*N];
void build(int p, int l, int r) {
if(l == r) {st[p] = v[l]; return;}
int mid = (l+r)/2;
build(2*p, l, mid);
build(2*p+1, mid+1, r);
st[p] = max(st[2*p], st[2*p+1]);
}
int push(int p, int l, int r) {
if(lz[p]) {
st[p] += lz[p];
if(l != r) {
lz[2*p] += lz[p];
lz[2*p+1] += lz[p];
}
lz[p] = 0;
}
}
int query(int p, int l, int r, int i, int j) {
push(p, l, r);
if(r < i or l > j) -INF;
if(l >= i and r <= j) {return st[p];}
int mid = (l+r)/2;
return max(query(2*p, l, mid, i, j),
query(2*p+1, mid+1, r, i, j));
void update(int p, int l, int r, int i, int j, int v) {
push(p, l, r);
if(r < i or l > j) return;
if(l >= i and r <= j) {
lz[p] += v;
push(p, l, r);
return;
}
int mid = (l+r)/2;
update(2*p, l, mid, i, j, v);
update(2*p + 1, mid + 1, r, i, j, v);
st[p] = max(st[2*p], st[2*p+1])
``