Submission #520448

#TimeUsernameProblemLanguageResultExecution timeMemory
520448qwerasdfzxclPyramid Base (IOI08_pyramid_base)C++14
40 / 100
1175 ms142952 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; struct Seg{ int tree[2202000], lazy[2202000]; void init(int i, int l, int r){ tree[i] = lazy[i] = 0; if (l==r) return; int m = (l+r)>>1; init(i<<1, l, m); init(i<<1|1, m+1, r); } void propagate(int i, int l, int r){ tree[i] += lazy[i]; if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i]; lazy[i] = 0; } void update(int i, int l, int r, int s, int e, int x){ propagate(i, l, r); if (r<s || e<l) return; if (s<=l && r<=e){ lazy[i] += x; propagate(i, l, r); return; } int m = (l+r)>>1; update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x); tree[i] = min(tree[i<<1], tree[i<<1|1]); } }tree; struct Query{ int l, r, c; Query(){} Query(int _l, int _r, int _c): l(_l), r(_r), c(_c) {} }; vector<Query> L[1001000], R[1001000]; int n, m, B; bool calc(int x){ tree.init(1, 1, m-x+1); for (int i=1;i<=x;i++){ for (auto &p:L[i]){ tree.update(1, 1, m-x+1, max(1, p.l-x+1), min(m-x+1, p.r), p.c); //if (x==3) printf("%d: %d %d -> %d %d\n", i, p.l, p.r, max(1, p.l-x+1), min(m-x+1, p.r)); } } if (tree.tree[1]<=B) return 1; for (int i=x+1;i<=n;i++){ for (auto &p:R[i-x]){ tree.update(1, 1, m-x+1, max(1, p.l-x+1), min(m-x+1, p.r), p.c); } for (auto &p:L[i]){ tree.update(1, 1, m-x+1, max(1, p.l-x+1), min(m-x+1, p.r), p.c); } if (tree.tree[1]<=B) return 1; } return 0; } struct Node{ int l, r, mn, len, prf, suf, ran; Node(){} Node(int _l, int _r, int _mn, int _len, int _prf, int _suf, int _ran): l(_l), r(_r), mn(_mn), len(_len), prf(_prf), suf(_suf), ran(_ran) {} Node operator +(const Node &N) const{ if (l==-1) return N; if (N.l==-1) return *this; Node ret(l, N.r, min(mn, N.mn), len + N.len, prf, N.suf, max(ran, N.ran)); if (prf==len && l==N.l) ret.prf = len + N.prf; if (N.suf==N.len && r==N.r) ret.suf = suf + N.len; if (r==N.l) ret.ran = max(ret.ran, suf + N.prf); return ret; } }I(-1, 0, 0, 0, 0, 0, 0); struct Seg2{ Node tree[2202000]; int lazy[2202000]; void init(int i, int l, int r){ lazy[i] = 0; if (l==r) {tree[i] = Node(0, 0, 0, 1, 1, 1, 1); return;} int m = (l+r)>>1; init(i<<1, l, m); init(i<<1|1, m+1, r); tree[i] = tree[i<<1] + tree[i<<1|1]; } void propagate(int i, int l, int r){ tree[i].l += lazy[i]; tree[i].r += lazy[i]; tree[i].mn += lazy[i]; if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i]; lazy[i] = 0; } void update(int i, int l, int r, int s, int e, int x){ propagate(i, l, r); if (r<s || e<l) return; if (s<=l && r<=e){ lazy[i] += x; propagate(i, l, r); return; } int m = (l+r)>>1; update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x); tree[i] = tree[i<<1] + tree[i<<1|1]; } int calc(){ if (tree[1].mn) return 0; return tree[1].ran; } }tree2; void solve(){ int l = 0, ans = 0; tree2.init(1, 1, m); for (int i=1;i<=n;i++){ for (auto &q:L[i]) tree2.update(1, 1, m, q.l, q.r, q.c); while(l<i && tree2.calc() < i-l) l++; ans = max(ans, i-l); } printf("%d\n", ans); exit(0); } int main(){ scanf("%d %d %d", &m, &n, &B); int q; scanf("%d", &q); for (int i=0;i<q;i++){ int x1, y1, x2, y2, c; scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &c); if (B==0) c = 1; L[y1].emplace_back(x1, x2, c); R[y2].emplace_back(x1, x2, -c); } if (B==0) solve(); int l = 1, r = min(m, n), ans = 0; while(l<=r){ int mid = (l+r)>>1; if (calc(mid)) l = mid+1, ans = mid; else r = mid-1; } //printf("YES\n"); //printf("%d\n", calc(3)); printf("%d\n", ans); return 0; }

Compilation message (stderr)

pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:133:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |     scanf("%d %d %d", &m, &n, &B);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:136:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
pyramid_base.cpp:139:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         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...