Submission #689344

#TimeUsernameProblemLanguageResultExecution timeMemory
689344finn__Pyramid Base (IOI08_pyramid_base)C++17
70 / 100
5094 ms56976 KiB
#include <bits/stdc++.h> using namespace std; template <typename T> class SegmentTreeMin { vector<T> t, z; size_t l; T neutral; public: SegmentTreeMin(size_t n, T _neutral) { neutral = _neutral; l = 1 << (32 - __builtin_clz(n)); t = vector<T>(2 * l, neutral); z = vector<T>(2 * l, 0); fill(t.begin() + l, t.begin() + l + n, 0); for (size_t i = l - 1; i; i--) t[i] = min(t[2 * i], t[2 * i + 1]); } private: void propagate(size_t k, size_t x, size_t y) { t[2 * k] += z[k]; t[2 * k + 1] += z[k]; z[2 * k] += z[k]; z[2 * k + 1] += z[k]; z[k] = 0; } void increment_r(size_t i, size_t j, T v, size_t k, size_t x, size_t y) { if (x > y || y < i || x > j) return; if (i <= x && y <= j) { t[k] += v; z[k] += v; } else { propagate(k, x, y); increment_r(i, j, v, 2 * k, x, (x + y) / 2); increment_r(i, j, v, 2 * k + 1, (x + y) / 2 + 1, y); t[k] = min(t[2 * k], t[2 * k + 1]); } } public: void increment(size_t i, size_t j, T v) { increment_r(i, j, v, 1, 0, l - 1); } T get_global_min() const { return t[1]; } }; struct Rectangle { int x1, y1, x2, y2, cost; }; struct Event { int x, y1, y2, cost; Event(int _x, int _y1, int _y2, int _cost) { x = _x; y1 = _y1; y2 = _y2; cost = _cost; } bool operator<(Event const &e) const { return x < e.x; } }; bool can_place_square( vector<Rectangle> const &rectangles, int m, int n, int side_length, int b) { vector<Event> events; for (Rectangle const &r : rectangles) { events.emplace_back( r.x1 - side_length + 1, max(r.y1 - side_length + 1, 0), r.y2, r.cost); events.emplace_back( r.x2 + 1, max(r.y1 - side_length + 1, 0), r.y2, -r.cost); } sort(events.begin(), events.end()); SegmentTreeMin<int> tree(n - side_length + 1, INT_MAX); int curr_x = events[0].x; for (Event const &e : events) { if (e.x != curr_x && 0 < e.x && curr_x <= m - side_length) { if (tree.get_global_min() <= b) return 1; curr_x = e.x; } tree.increment(e.y1, min(e.y2, n - side_length), e.cost); } return 0; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); unsigned m, n, b, p; cin >> m >> n >> b >> p; vector<Rectangle> rectangles(p); for (auto &[x1, y1, x2, y2, cost] : rectangles) { cin >> x1 >> y1 >> x2 >> y2 >> cost; x1--, y1--, x2--, y2--; } unsigned u = 0, v = min(m, n); while (u < v) { unsigned side_length = (u + v + 1) / 2; if (can_place_square(rectangles, m, n, side_length, b)) u = side_length; else v = side_length - 1; } cout << u << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...