Submission #1185356

#TimeUsernameProblemLanguageResultExecution timeMemory
1185356tapilyocaWall (IOI14_wall)C++20
100 / 100
742 ms214144 KiB
/*********************************************** * auth: tapilyoca * * date: 04/15/2025 at 08:29:42 * * dots: https://github.com/tapilyoca/dotilyoca * ***********************************************/ #include <bits/stdc++.h> #include "wall.h" using namespace std; const long long MOD = 1e9+7; template<typename T> using vec = vector<T>; using ll = long long; using vll = vec<ll>; using vvll = vec<vll>; using pll = pair<ll,ll>; using str = string; #define pb push_back #define dbg(x) cerr << #x << ": " << x << endl; /***********************************************/ struct Segtree { int l, r; Segtree *lt, *rt; int lb, ub; bool lazy; Segtree(int left, int right) { l = left; r = right; lt = rt = nullptr; lb = 0; ub = INT_MAX; lazy = 0; if(l == r) return; int mid = (l+r)>>1; lt = new Segtree(l,mid); rt = new Segtree(mid+1,r); } void propagate() { if(lazy) { if(lt){ // cerr << "from propagation "; // lt->debug(); lt->lb = max(lb, lt->lb); lt->ub = max(lt->lb, lt->ub); lt->ub = min(ub, lt->ub); lt->lb = min(lt->ub, lt->lb); rt->lb = max(lb, rt->lb); rt->ub = max(rt->lb, rt->ub); rt->ub = min(ub, rt->ub); rt->lb = min(rt->ub, rt->lb); lt->lazy = 1; rt->lazy = 1; lb = 0; ub = INT_MAX; } lazy = 0; } } void maximize(int ml, int mr, int val) { if(l > mr or r < ml) return; propagate(); if(ml <= l and r <= mr) { lazy = 1; lb = max(val,lb); ub = max(lb,ub); propagate(); // debug(); return; } lt->maximize(ml,mr,val); rt->maximize(ml,mr,val); // debug(); } void minimize(int ml, int mr, int val) { if(l > mr or r < ml) return; propagate(); if(ml <= l and r <= mr) { lazy = 1; ub = min(val,ub); lb = min(ub,lb); propagate(); // debug(); return; } lt->minimize(ml,mr,val); rt->minimize(ml,mr,val); } int query(int dex) { propagate(); if(dex < l or r < dex) return 0; // debug(); if(l == r) { return lb; } return lt->query(dex) + rt->query(dex); } void debug() { cerr << "node " << l << " " << r << " bounds " << lb << " " << ub << endl; } void preorder() { propagate(); debug(); if(lt) { lt->preorder(); rt->preorder(); } } }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { Segtree st(0,n-1); for(int i = 0; i < k; i++) { bool type = (op[i] == 1 ? 1 : 0); if(type) { // add aka maximize st.maximize(left[i],right[i],height[i]); } else { st.minimize(left[i],right[i],height[i]); } } // st.preorder(); for(int i = 0; i < n; i++) { finalHeight[i] = st.query(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...