제출 #943415

#제출 시각아이디문제언어결과실행 시간메모리
943415panWall (IOI14_wall)C++17
61 / 100
615 ms262148 KiB
#include "wall.h" #include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //#include "bits_stdc++.h" #define f first #define s second #define pb push_back #define mp make_pair #define lb lower_bound #define ub upper_bound #define input(x) scanf("%lld", &x); #define input2(x, y) scanf("%lld%lld", &x, &y); #define input3(x, y, z) scanf("%lld%lld%lld", &x, &y, &z); #define input4(x, y, z, a) scanf("%lld%lld%lld%lld", &x, &y, &z, &a); #define print(x, y) printf("%lld%c", x, y); #define show(x) cerr << #x << " is " << x << endl; #define show2(x,y) cerr << #x << " is " << x << " " << #y << " is " << y << endl; #define show3(x,y,z) cerr << #x << " is " << x << " " << #y << " is " << y << " " << #z << " is " << z << endl; #define discretize(x) sort(x.begin(), x.end()); x.erase(unique(x.begin(), x.end()), x.end()); using namespace std; //using namespace __gnu_pbds; //#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> //#define ordered_multiset tree<int, null_type, less_equal<int>, srb_tree_tag, tree_order_statistics_node_update> typedef long long ll; typedef long double ld; typedef pair<ld, ll> pd; typedef pair<string, ll> psl; typedef pair<ll, ll> pi; typedef pair<ll, pi> pii; ll const INF = 1e13; struct node{ int s, e, m; ll lower, upper; ll lazymin, lazymax; node *l, *r; node (int S, int E) { s = S, e = E, m = (s+e)/2; lower= upper = 0; lazymin = INF, lazymax = -INF; l = r = nullptr; } void create() { if (s!=e && l==nullptr) { l = new node(s, m); r = new node(m+1, e); } } void propogate() { if (s==e) return; create(); if (lazymin!=INF) // minimum first { l->lazymax = min(l->lazymax, lazymin); // prevent max from overwriting min l->lazymin = min(l->lazymin, lazymin); l->lower = min(l->lower, lazymin); l->upper = min(l->upper, lazymin); r->lazymax = min(r->lazymax, lazymin); r->lazymin = min(r->lazymin, lazymin); r->lower = min(r->lower, lazymin); r->upper = min(r->upper, lazymin); lazymin = INF; } if (lazymax!=-INF) // then maximum { l->lazymax = max(l->lazymax, lazymax); l->lower = max(l->lower, lazymax); l->upper = max(l->upper, lazymax); r->lazymax = max(r->lazymax, lazymax); r->lower = max(r->lower, lazymax); r->upper = max(r->upper, lazymax); lazymax = -INF; } } void update(int S, int E, ll V, ll mm) { if(s==S && e==E) { if (mm==2) // min { lazymax = min(lazymax, V); lazymin = min(lazymin, V); lower = min(lower, V); upper = min(upper, V); } else if (mm==1)// max { lazymax = max(lazymax, V); lower = max(lower, V); upper = max(upper, V); } } else { propogate(); if(E <= m) l->update(S, E, V, mm); else if (m < S) r->update(S, E, V, mm); else l->update(S, m, V, mm),r->update(m+1, E, V, mm); lower = min(l->lower, r->lower); upper = max(l->upper, r->upper); } } ll query(ll pos) { if (s==e) return upper; propogate(); if (pos<=m) return l->query(pos); else return r->query(pos); } } *root; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { root = new node(0, n-1); for (ll i=0; i<k; ++i) root->update(left[i], right[i], height[i], op[i]); for (ll i=0; i<n; ++i) finalHeight[i] = root->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...