#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5; // Máxima cantidad de mástiles
const int MAXS = 262144; // Tamaño del Segment Tree (potencia de 2 >= MAXN)
ll seg[MAXS], dp[MAXN], vf[MAXN], pot = 131072, dpCalc[MAXN + 1];
// Función recursiva para distribuir los pesos en el árbol de segmentos.
void calc(ll x, ll nod) {
if (nod >= pot) {
// Al llegar a una hoja, asignamos el valor.
vf[nod - pot] = x;
return;
}
ll mid = x / 2; // Dividimos el peso por la mitad.
ll iz = mid, der = mid;
if (x % 2 != 0) der++; // Si es impar, asignamos 1 más a la derecha.
ll maxDer = seg[nod * 2 + 1]; // Límite del hijo derecho.
// Si la derecha no puede recibir todo, enviamos el exceso a la izquierda.
if (maxDer < der) {
iz += der - maxDer;
der = maxDer;
}
// Llamadas recursivas para distribuir en los hijos.
if (iz > 0) calc(iz, nod * 2);
if (der > 0) calc(der, nod * 2 + 1);
}
int main() {
ll n, tot = 0, a, b, res = 0;
cin >> n;
// Precomputamos las sumas acumuladas de los costos.
for (ll i = 2; i <= MAXN; i++) {
dpCalc[i] = dpCalc[i - 1] + (i - 1);
}
// Procesamos los mástiles.
for (ll i = 0; i < n; i++) {
cin >> a >> b;
tot += b; // Sumar al total las velas de este mástil.
a--; // Ajustamos a índice 0-based.
ll lim = a - b;
if (lim >= 0) dp[lim]--; // Reducimos la demanda en el límite inferior.
dp[a]++; // Aumentamos la demanda en la altura correspondiente.
}
// Acumulamos las demandas desde atrás hacia adelante.
for (ll i = MAXN - 2; i >= 0; i--) {
dp[i] += dp[i + 1];
}
// Inicializamos las hojas del Segment Tree.
for (ll i = pot; i < MAXS; i++) {
seg[i] = (i - pot < MAXN) ? dp[i - pot] : 0;
}
// Construimos el Segment Tree desde las hojas hacia la raíz.
for (ll i = pot - 1; i > 0; i--) {
seg[i] = seg[i * 2] + seg[i * 2 + 1];
}
// Ejecutamos la distribución de los pesos.
calc(tot, 1);
// Calculamos el resultado final sumando los costos acumulados.
for (ll i = 0; i < MAXN; i++) {
res += dpCalc[vf[i]];
}
cout << res << '\n';
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4688 KB |
Output is correct |
2 |
Incorrect |
3 ms |
4688 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4688 KB |
Output is correct |
2 |
Incorrect |
3 ms |
4688 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
4688 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
4688 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
4688 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
14 ms |
9296 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
13 ms |
4720 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
23 ms |
9296 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
31 ms |
9296 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
42 ms |
9288 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
38 ms |
9288 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |