Submission #1105601

#TimeUsernameProblemLanguageResultExecution timeMemory
1105601FaggiSails (IOI07_sails)C++11
0 / 100
42 ms9296 KiB
#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; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...