Submission #1104982

# Submission time Handle Problem Language Result Execution time Memory
1104982 2024-10-25T03:27:19 Z Faggi Sails (IOI07_sails) C++11
25 / 100
43 ms 5080 KB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

vector<ll> tamDP;
vector<ll> calcs;
ll tam;

// Función para verificar si es posible distribuir con el límite `x`.
bool can(vector<ll> dp, ll x) {
    ll ma, sob, i;
    for (i = tam; i > 0ll; i--) {
        ma = min(x, tamDP[i]);  // Máximo permitido en esta altura.
        sob = 0ll;
        if (dp[i] > ma) {
            sob = dp[i] - ma;
            dp[i] = ma;
            if (i > 1ll) {
                dp[i - 1ll] += sob;  // Propaga el sobrante hacia abajo.
            } else {
                return false;  // No es posible distribuir correctamente.
            }
        }
    }
    return true;
}

// Función para calcular la ineficiencia total.
ll calc(vector<ll> dp, ll x) {
    ll ma, sob, i, res = 0ll;
    for (i = tam; i > 0ll; i--) {
        ma = min(x, tamDP[i]);
        sob = 0ll;
        if (dp[i] > ma) {
            sob = dp[i] - ma;
            dp[i] = ma;
            dp[i - 1ll] += sob;
        }
    }
    // Suma las ineficiencias usando el vector `calcs`.
    for (i = tam; i > 0ll; i--) {
        res += calcs[dp[i]];
    }
    return res;
}

int main() {
    ll n, i, mi = 0ll, ma = 0ll, piv, pos;
    cin >> n;

    // Inicialización del vector `calcs`.
    calcs.resize(n + 1ll, 0ll);
    for (i = 2ll; i <= n; i++) {
        calcs[i] = calcs[i - 1ll] + (i - 1ll);
    }

    vector<pair<ll, ll>> v(n);
    for (i = 0ll; i < n; i++) {
        cin >> v[i].first >> v[i].second;
        tam = max(v[i].first, tam);
    }

    vector<ll> dp(tam + 1ll, 0ll);
    tamDP.resize(tam + 1ll, 0ll);

    // Construcción de los vectores `dp` y `tamDP`.
    for (i = 0ll; i < n; i++) {
        dp[v[i].first] += 1ll;
        dp[v[i].first - v[i].second] -= 1ll;
        tamDP[v[i].first] += 1ll;
    }

    // Propagación de los valores hacia abajo.
    ma = dp[tam];
    for (i = tam - 1ll; i >= 0ll; i--) {
        dp[i] += dp[i + 1ll];
        ma = max(ma, dp[i]);
        tamDP[i] += tamDP[i + 1ll];
    }

    pos = ma;
    // Búsqueda binaria para encontrar el mínimo límite posible.
    while (mi <= ma) {
        piv = (mi + ma) / 2ll;
        if (can(vector<ll>(dp), piv)) {  // Usamos una copia de `dp`.
            ma = piv - 1ll;
            pos = piv;
        } else {
            mi = piv + 1ll;
        }
    }

    // Cálculo final de la ineficiencia.
    cout << calc(vector<ll>(dp), pos) << endl;

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 508 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 504 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 336 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 1124 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 15 ms 1636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 18 ms 2760 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 28 ms 4432 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 39 ms 4844 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 43 ms 5080 KB Output isn't correct
2 Halted 0 ms 0 KB -