Submission #805404

#TimeUsernameProblemLanguageResultExecution timeMemory
805404HaroldVemenoWall (IOI14_wall)C++17
100 / 100
511 ms69516 KiB
#include "wall.h" #include <bits/stdc++.h> #ifdef GUDEB #define D(x) cerr << #x << ": " << (x) << '\n'; #define ifdeb if(true) #else #define D(x) ; #define ifdeb if(false) #endif #define all(x) begin(x), end(x) using namespace std; using ull = unsigned long long; using ll = long long; // #define int ll; int n; int s; int lbs[8000000]; int ubs[8000000]; void push(int x) { if(x >= s) return; for(int c : {2*x, 2*x+1}) { lbs[c] = max(lbs[c], lbs[x]); lbs[c] = min(lbs[c], ubs[x]); ubs[c] = min(ubs[c], ubs[x]); ubs[c] = max(ubs[c], lbs[x]); } ubs[x] = 100000; lbs[x] = 0; } void walk(int l, int r, int op, int h, int u, int lu, int ru) { D(l) D(r) D(u) D(lu) D(ru) if(r <= lu || ru <= l) return; if(l <= lu && ru <= r) { if(op == 1) { lbs[u] = max(lbs[u], h); ubs[u] = max(ubs[u], lbs[u]); } else { ubs[u] = min(ubs[u], h); lbs[u] = min(lbs[u], ubs[u]); } return; } push(u); int mu = (lu+ru)/2; walk(l, r, op, h, 2*u , lu, mu); walk(l, r, op, h, 2*u+1, mu, ru); } void buildWall(int N, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ n = N; s = 1; while(s < n) s *= 2; for(int i = s-1; i > 0; --i) { ubs[i] = 100000; } for(int i = 0; i < k; ++i) { walk(left[i], right[i]+1, op[i], height[i], 1, 0, s); } for(int i = 1; i < s; ++i) { push(i); } for(int i = 0; i < n; ++i) { finalHeight[i] = lbs[s+i]; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...