Submission #279744

#TimeUsernameProblemLanguageResultExecution timeMemory
279744evpipisPyramid Base (IOI08_pyramid_base)C++11
70 / 100
5103 ms130848 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; const int len = 1e6+4; const ll inf = 1e16; int cost[len], n, m, bud, q; vector<int> buck[len]; struct rectangle{ int x1, x2, y1, y2; } rec[len]; struct{ struct node{ ll mn, lazy; node(ll mn_ = 0, ll lazy_ = 0){ mn = mn_; lazy = lazy_; } } tree[4*len]; void prop(int p, int l, int r){ if (!tree[p].lazy) return; tree[p].mn += tree[p].lazy; if (l != r){ tree[2*p].lazy += tree[p].lazy; tree[2*p+1].lazy += tree[p].lazy; } tree[p].lazy = 0; } void update(int p, int l, int r, int i, int j, int v){ prop(p, l, r); if (i <= l && r <= j) return void(tree[p].lazy += v); int mid = (l+r)/2; if (i <= mid) update(2*p, l, mid, i, j, v); if (j >= mid+1) update(2*p+1, mid+1, r, i, j, v); prop(2*p, l, mid), prop(2*p+1, mid+1, r); tree[p].mn = min(tree[2*p].mn, tree[2*p+1].mn); } ll query(int p, int l, int r, int i, int j){ prop(p, l, r); if (r < i || j < l) return inf; if (i <= l && r <= j) return tree[p].mn; int mid = (l+r)/2; return min(query(2*p, l, mid, i, j), query(2*p+1, mid+1, r, i, j)); } } seg_tree1; bool check(int k){ for (int i = 1; i <= q; i++){ int y1 = rec[i].y1, y2 = rec[i].y2; buck[max(1, y1-k+1)].pb(i); buck[y2+1].pb(-i); } bool ans = false; for (int y = 1; y <= m+1; y++){ int must = (y==1); for (int j = 0; j < buck[y].size(); j++){ int i = abs(buck[y][j]); int x1 = rec[i].x1, x2 = rec[i].x2; if (buck[y][j] > 0) seg_tree1.update(1, 1, n, max(1, x1-k+1), x2, cost[i]); else must = 1, seg_tree1.update(1, 1, n, max(1, x1-k+1), x2, -cost[i]); } buck[y].clear(); if (must && y <= m-k+1) ans |= (seg_tree1.query(1, 1, n, 1, n-k+1) <= bud); } return ans; } int solve1(){ int l = 1, r = min(n, m), ans = 0; while (l <= r){ int mid = (l+r)/2; if (check(mid)) ans = mid, l = mid+1; else r = mid-1; } return ans; } int main(){ scanf("%d %d %d %d", &n, &m, &bud, &q); for (int i = 1; i <= q; i++) scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]); printf("%d\n", solve1()); return 0; }

Compilation message (stderr)

pyramid_base.cpp: In function 'bool check(int)':
pyramid_base.cpp:77:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |         for (int j = 0; j < buck[y].size(); j++){
      |                         ~~^~~~~~~~~~~~~~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:109:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |     scanf("%d %d %d %d", &n, &m, &bud, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:111:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  111 |         scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[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...
#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...