답안 #1105601

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1105601 2024-10-27T01:17:58 Z Faggi Sails (IOI07_sails) C++11
0 / 100
42 ms 9296 KB
#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 -