Submission #54199

#TimeUsernameProblemLanguageResultExecution timeMemory
54199baactreePyramid Base (IOI08_pyramid_base)C++17
46 / 100
5100 ms71512 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll tree[1 << 21][2]; const ll inf = 0x3f3f3f3f3f3f3f3f; void push(int nodele, int noderi, int node) { tree[node][0] += tree[node][1]; if (nodele != noderi) { tree[node * 2][1] += tree[node][1]; tree[node * 2 + 1][1] += tree[node][1]; } tree[node][1] = 0; } void update(int le, int ri, ll val, int nodele, int noderi, int node) { push(nodele, noderi, node); if (le > noderi || ri < nodele)return; if (le <= nodele && noderi <= ri) { tree[node][1] = val; push(nodele, noderi, node); return; } int mid = (nodele + noderi) / 2; update(le, ri, val, nodele, mid, node * 2); update(le, ri, val, mid + 1, noderi, node * 2 + 1); tree[node][0] = min(tree[node * 2][0], tree[node * 2 + 1][0]); } ll query(int le, int ri, int nodele, int noderi, int node) { push(nodele, noderi, node); if (le > noderi || ri < nodele)return inf; if (le <= nodele && noderi <= ri)return tree[node][0]; int mid = (nodele + noderi) / 2; return min(query(le, ri, nodele, mid, node * 2), query(le, ri, mid + 1, noderi, node * 2 + 1)); } int n, m, b, p; vector<tuple<int, int, int> > vec[1000005]; bool possi(int k) { memset(tree, 0, sizeof(tree)); for (int i = 1; i <= n; i++) { for (auto v : vec[i]) { int y1, y2, c; tie(y1, y2, c) = v; if(c>0) update(max(1, y1 - k + 1), min(m - k + 1, y2), c,1,1000000,1); } if (i >= k) { for (auto v : vec[i - k]) { int y1, y2, c; tie(y1, y2, c) = v; if (c < 0) update(max(1, y1 - k + 1), min(m - k + 1, y2), c, 1, 1000000, 1); } } if (i >= k && query(1, m - k + 1, 1, 1000000, 1) <= b) return true; } return false; } int main() { scanf("%d%d%d%d", &n, &m, &b, &p); for (int i = 0; i < p; i++) { int x1, y1, x2, y2, c; scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c); vec[x1].emplace_back(y1, y2, c); vec[x2].emplace_back(y1, y2, -c); } int le, ri, ans, mid; le = 1; ri = m; ans = 0; while (le <= ri) { mid = (le + ri) / 2; if (possi(mid)) { ans = mid; le = mid + 1; } else ri = mid - 1; } printf("%d\n", ans); return 0; }

Compilation message (stderr)

pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:56:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d", &n, &m, &b, &p);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:59:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...