Submission #762623

#TimeUsernameProblemLanguageResultExecution timeMemory
762623gun_ganWall (IOI14_wall)C++17
24 / 100
542 ms51640 KiB
#include <bits/stdc++.h> using namespace std; const int MX = 2e6 + 5; struct segtree { int lazyMin[4 * MX], lazyMax[4 * MX], res[MX]; // each range [l, r] consider we have a bound such that elements are // in [lazyMax, lazyMin], treat max updates as increase in lower bound // treat min updates as decrease in upper bound // when lazyMax = lazyMin, updates becomes equivalent to range set void apply(int u, int v) { if(lazyMax[u] <= lazyMax[v] && lazyMin[u] >= lazyMin[v]) { lazyMax[u] = lazyMax[v]; lazyMin[u] = lazyMin[v]; } else if(lazyMin[v] <= lazyMax[u]) { lazyMax[u] = lazyMin[u] = lazyMin[v]; } else if(lazyMax[v] >= lazyMin[u]) { lazyMax[u] = lazyMin[u] = lazyMax[v]; } } void push(int v, int l, int r) { if(l == r) return; apply(v * 2 + 0, v); apply(v * 2 + 1, v); assert(lazyMax[2 * v] <= lazyMin[2 * v]); assert(lazyMax[2 * v + 1] <= lazyMin[2 * v + 1]); lazyMax[v] = 0, lazyMin[v] = 1e9; } void minimize(int v, int l, int r, int ql, int qr, int x) { push(v, l, r); if(r < ql || l > qr) return; if(ql <= l && qr >= r) { if(lazyMax[v] > x) { lazyMax[v] = lazyMin[v] = x; } else if(lazyMin[v] > x) { lazyMin[v] = x; } push(v, l, r); // cout << "minim (" << l << "," << r << ") " << lazyMin[v] << ' ' << lazyMax[v] << " " << v << '\n'; return; } int m = (l + r) >> 1; minimize(v * 2 + 0, l, m + 0, ql, qr, x); minimize(v * 2 + 1, m + 1, r, ql, qr, x); } void maximize(int v, int l, int r, int ql, int qr, int x) { push(v, l, r); if(r < ql || l > qr) return; if(ql <= l && qr >= r) { if(lazyMin[v] < x) { lazyMax[v] = lazyMin[v] = x; } else if(lazyMax[v] < x) { lazyMax[v] = x; } push(v, l, r); return; } int m = (l + r) >> 1; maximize(v * 2 + 0, l, m + 0, ql, qr, x); maximize(v * 2 + 1, m + 1, r, ql, qr, x); } void get(int v, int l, int r) { push(v, l, r); if(l == r) { // cout << "get (" << l << "," << r << ") " << lazyMax[v] << " " << lazyMin[v] << " " << v << '\n'; res[l] = min(lazyMax[v], lazyMin[v]); return; } int m = (l + r) >> 1; get(v * 2 + 0, l, m + 0); get(v * 2 + 1, m + 1, r); } void init() { for(int i = 0; i < 4 * MX; i++) { lazyMin[i] = 1e9; } } } st; void buildWall(int N, int K, int op[], int l[], int r[], int h[], int finalHeight[]) { st.init(); for(int i = 0; i < K; i++) { if(op[i] == 1) st.maximize(1, 0, N - 1, l[i], r[i], h[i]); else st.minimize(1, 0, N - 1, l[i], r[i], h[i]); } st.get(1, 0, N - 1); for(int i = 0; i < N; i++) { finalHeight[i] = st.res[i]; } } // int op[100], l[100], r[100], h[100], N, K, f[100]; // int main() { // cin >> N >> K; // for(int i = 0; i < K; i++) { // cin >> op[i] >> l[i] >> r[i] >> h[i]; // } // buildWall(N, K, op, l, r, h, f); // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...