Submission #1186102

#TimeUsernameProblemLanguageResultExecution timeMemory
1186102harvsftwWall (IOI14_wall)C++20
100 / 100
381 ms40272 KiB
#include <bits/stdc++.h> #include "wall.h" using namespace std; #define F(i, n) for(int i = 0; i < (n); i++) using pii = pair<int, int>; pii merge(pii a, pii b) { if(a.second < b.first) { return {b.first, b.first}; } else if(b.second < a.first) { return {b.second, b.second}; } else { return {max(a.first, b.first), min(a.second, b.second)}; } } struct segtree { pii segtree[1 << 21]; int segtree_size = 1; pii zero = {0, INT_MAX}; void init(int n) { segtree_size = 1; while(segtree_size < n) { segtree_size <<= 1; } F(i, 2 * segtree_size) { segtree[i] = zero; } } pii add(pii a, pii b) { return merge(a, b); } pii get(int i, int window_l, int window_r, int l, int r) { if(l <= window_l && window_r <= r) { return segtree[i]; } else if(window_l <= l && l <= window_r || window_l <= r && r <= window_r) { int m = (window_l + window_r) / 2; return add(get(i * 2 + 0, window_l,m,l,r), get(i * 2 + 1,m + 1,window_r,l,r)); } else { return zero; } } pii get(int l, int r) { if(l > r) { return zero; } return get(1, 0, segtree_size - 1, l, r); } void set(int i, pii data) { i += segtree_size; segtree[i] = data; i /= 2; while(i > 0) { segtree[i] = add(segtree[i * 2 + 0], segtree[i * 2 + 1]); i /= 2; } } } ohio; enum evt_type { ENTRY, EXIT }; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ vector<pair<int, int>> intervals; vector<tuple<int, evt_type, int>> evts; ohio.init(k); F(i, k) { if(op[i] == 1) { intervals.emplace_back(height[i], INT_MAX); } else if(op[i] == 2) { intervals.emplace_back(0, height[i]); } else { assert(false); } evts.emplace_back(left[i], ENTRY, i); evts.emplace_back(right[i] + 1, EXIT, i); } sort(evts.begin(), evts.end()); auto it = evts.begin(); F(i, n) { while(it != evts.end() && get<0>(*it) == i) { auto [wall_idx, evt_type, interval_idx] = *it; if(evt_type == ENTRY) { ohio.set(interval_idx, intervals[interval_idx]); } else { ohio.set(interval_idx, ohio.zero); } ++it; } finalHeight[i] = merge({0, 0}, ohio.segtree[1]).first; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...