Submission #530581

#TimeUsernameProblemLanguageResultExecution timeMemory
530581EyedPyramid Base (IOI08_pyramid_base)C++17
80 / 100
5076 ms89236 KiB
#include <algorithm> #include <iostream> #include <string> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <cmath> using namespace std; typedef long long ll; typedef pair<int, int> pii; const ll MOD = 1e9 + 7; int n, m, b, p; struct rType { int y1; int y2; int c; rType(int yy1 = 0, int yy2 = 0, int cc = 0) : y1(yy1), y2(yy2), c(cc) {}; }; vector<rType> addRect[1000005]; vector<rType> subRect[1000005]; int seg[4000020]; int lazy[4000020]; bool mark[4000020]; void build(int v, int tl, int tr) { lazy[v] = 0; seg[v] = 0; mark[v] = false; if (tl == tr) return; int mid = (tl + tr) / 2; build(2 * v, tl, mid); build(2 * v + 1, mid + 1, tr); } void build() { build(1, 0, m - 1); } void push(int v) { if (mark[v]) { lazy[2 * v] += lazy[v]; lazy[2 * v + 1] += lazy[v]; mark[2 * v] = true; mark[2 * v + 1] = true; seg[2 * v] += lazy[v]; seg[2 * v + 1] += lazy[v]; lazy[v] = 0; mark[v] = false; } } void upd(int v, int tl, int tr, int l, int r, int x) { if (l > r) return; if (l <= tl && r >= tr) { lazy[v] += x; seg[v] += x; mark[v] = true; return; } push(v); int mid = (tl + tr) / 2; upd(2 * v, tl, mid, max(l, tl), min(r, mid), x); upd(2 * v + 1, mid + 1, tr, max(l, mid + 1), min(r, tr), x); seg[v] = min(seg[2 * v], seg[2 * v + 1]); } void upd(int l, int r, int x) { upd(1, 0, m - 1, l, r, x); } int qry(int v, int tl, int tr, int l, int r) { if (l > r) return 1e9; if (l <= tl && r >= tr) return seg[v]; push(v); int mid = (tl + tr) / 2; return min(qry(2 * v, tl, mid, max(l, tl), min(r, mid)), qry(2 * v + 1, mid + 1, tr, max(l, mid + 1), min(r, tr))); } int qry(int l, int r) { return qry(1, 0, m - 1, l, r); } bool check(int p) { build(1, p-1, m-1); for (int i = 0; i < p; ++i) { for (rType r : addRect[i]) { upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), r.c); } } if (qry(1, p-1, m-1, p - 1, m - 1) <= b) return true; for (int i = p; i < n; ++i) { bool hasChange = false; for (rType r : addRect[i]) { upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), r.c); hasChange = true; } for (rType r : subRect[i - p]) { upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), -r.c); hasChange = true; } if (!hasChange) continue; if (qry(1, p-1, m-1, p - 1, m - 1) <= b) return true; } return false; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; cin >> b; cin >> p; for (int i = 0; i < p; ++i) { int x1, y1, x2, y2, c; cin >> x1 >> y1 >> x2 >> y2 >> c; --x1; --y1; --x2; --y2; addRect[x1].push_back(rType(y1, y2, c)); subRect[x2].push_back(rType(y1, y2, c)); } int l = 0; int r = min(m, n); while (l < r) { int mid = (l + r + 1) / 2; if (check(mid)) l = mid; else r = mid - 1; } cout << l << endl; return 0; }
#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...