A Huge Tower
Solución en video
Por Abhiraj Mallangi
Nota: la solución en video puede no coincidir con las demás. Código en C++ y Java.
Video de YouTube (ptHBkaY6krQ)
Solución
Explicación
Primero, definamos algunas variables. Sean los tamaños de los bloques, ordenados de menor a mayor. Sea la cantidad de índices tales que y . Sea la respuesta si la torre consistiera solo de los bloques . Por supuesto, esto significa que será la respuesta final.
Para cualquier torre formada por los primeros bloques, siempre habrá formas de insertar el bloque de tamaño en la torre. Para entender por qué, consideremos dónde se puede insertar el bloque de tamaño . El bloque de tamaño siempre se puede insertar en la base de la torre, porque no hay ningún bloque más grande que en la torre. El bloque de tamaño se puede insertar encima de algún bloque de tamaño si y solo si .
Así, vemos que , porque hay formas válidas de insertar el bloque en cualquiera de las torres válidas.
Implementación
Esta solución usa 2 punteros en lugar de crear los arreglos y .
Complejidad temporal:
#include <algorithm>
#include <iostream>
#include <vector>
const int MOD = 1e9 + 9;
int main() {
int n, d;
std::cin >> n >> d;
std::vector<int> blocks(n);
for (int i = 0; i < n; i++) { std::cin >> blocks[i]; }
sort(blocks.begin(), blocks.end()); // ordenamos los bloques
int right = 0;
int res = 1;
for (int left = 0; left < n; left++) {
while (right < n - 1 && blocks[right + 1] - blocks[left] <= d) { right++; }
// torre más grande que podemos construir cuando el bloque blocks[left] es la base
int dist = right - left + 1;
res = (res * 1LL * dist) % MOD;
}
std::cout << res << '\n';
}import java.io.*;
import java.util.*;
public class tower {
static final int MOD = 1000000009;
public static void main(String[] args) {
Kattio io = new Kattio();
int n = io.nextInt();
int d = io.nextInt();
int[] blocks = new int[n];
for (int i = 0; i < n; i++) { blocks[i] = io.nextInt(); }
Arrays.sort(blocks); // ordenamos los bloques
int right = 0;
long res = 1;
for (int left = 0; left < n; left++) {
while (right < n - 1 && blocks[right + 1] - blocks[left] <= d) { right++; }
// torre más grande que podemos construir cuando el bloque blocks[left] es la base
int dist = right - left + 1;
res = (res * dist) % MOD;
}
io.println(res);
io.close();
}
// CodeSnip{Kattio}
}MOD = 10**9 + 9
n, d = map(int, input().split())
blocks = list(map(int, input().split()))
blocks.sort() # ordenamos los bloques
right = 0
res = 1
for left in range(n):
while right < n - 1 and blocks[right + 1] - blocks[left] <= d:
right += 1
# torre más grande que podemos construir cuando el bloque blocks[left] es la base
dist = right - left + 1
res = (res * dist) % MOD
print(res)