Submission #421978

#TimeUsernameProblemLanguageResultExecution timeMemory
421978OzyWall (IOI14_wall)C++17
100 / 100
1166 ms117992 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for (int i = (a); i <= (b); i++) #define repa(i,a,b) for (int i = (a); i >= (b); i--) #define lli long long int #define debugsl(a) cout << #a << " = " << a << ", " #define debug(a) cout << #a << " = " << a << endl #define MAX 4500002 #define INF 1000000000 #define sube 1 #define baja 2 lli h[MAX], arriba[MAX], abajo[MAX]; lli ult,offset; void push(lli nodo, lli s, lli e){ lli hijo; if (s == e){ h[nodo] = max(h[nodo], abajo[nodo]); h[nodo] = min(h[nodo], arriba[nodo]); abajo[nodo] = 0; arriba[nodo] = INF; return; } hijo = nodo * 2; arriba[hijo] = min(arriba[hijo], arriba[nodo]); abajo[hijo] = min(abajo[hijo], arriba[nodo]); arriba[hijo] = max(arriba[hijo], abajo[nodo]); abajo[hijo] = max(abajo[hijo], abajo[nodo]); hijo++; arriba[hijo] = min(arriba[hijo], arriba[nodo]); abajo[hijo] = min(abajo[hijo], arriba[nodo]); arriba[hijo] = max(arriba[hijo], abajo[nodo]); abajo[hijo] = max(abajo[hijo], abajo[nodo]); abajo[nodo] = 0; arriba[nodo] = INF; } void update(lli nodo, lli s, lli e, lli l, lli r, lli altura, lli tipo){ push(nodo, s, e); // EMPUJA A LOS HIJOS if (s > r || e < l) return; // SI EL RANGO A ACTUALIZAR ESTA FUERA DE ESTE NO HAGAS NADA if (s == e){ // SI EL RANGO A ACTUALIZAR ES DE 1 ENTONCES ES HOJA, MODIFICA SU ALTURA if (tipo == sube) h[nodo] = max(h[nodo], altura); else if (tipo == baja) h[nodo] = min(h[nodo], altura); } if (s >= l && e <= r){ // SI EL RANGO ESTA COMPLETAMENTE CONTENIDO MODIFICA EL LIMITE if (tipo == sube) abajo[nodo] = max(abajo[nodo], altura); else if (tipo == baja) arriba[nodo] = min(arriba[nodo], altura); return; } lli mitad = (s + e) / 2; update(nodo * 2, s, mitad, l, r, altura, tipo); update(nodo * 2 + 1, mitad + 1, e, l, r, altura, tipo); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ offset = 1; while (offset <= n) offset *= 2; repa(i, offset - 1, 1){ arriba[i] = INF; abajo[i] = 0; } rep(i, 0, k - 1) update(1, 0, offset - 1, left[i], right[i], height[i], op[i]); rep(i, 1, offset - 1) push(i, 0, n - 1); rep(i, offset, offset + n - 1) push(i, i, i); rep(i, offset, offset + n - 1) finalHeight[i - offset] = h[i]; return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...