Submission #880301

# Submission time Handle Problem Language Result Execution time Memory
880301 2023-11-29T06:37:21 Z rxlfd314 Pyramid Base (IOI08_pyramid_base) C++17
35 / 100
979 ms 170112 KB
#include <bits/stdc++.h>
using namespace std;
using ari2 = array<int, 2>;
using ari3 = array<int, 3>;
using ari4 = array<int, 4>;

#define vt vector
#define size(x) (int((x).size()))
#define all(x) begin(x), end(x)

#define REP(a, b, c, d) for (int a = (b); (d) > 0 ? a <= (c) : a >= (c); a += (d))
#define FOR(a, b, c) REP(a, b, c, 1)
#define ROF(a, b, c) REP(a, b, c, -1)

#define chmax(a, b) (a = a > (b) ? a : (b))
#define chmin(a, b) (a = a < (b) ? a : (b))

struct ST1 {
  vt<int> st, lz;
  ST1(int n) {
    st.resize(n<<2);
    lz.resize(n<<2);
  }
  #define lc i << 1
  #define rc i << 1 | 1
  void push(int i) {
    if (!lz[i])
      return;
    st[lc] += lz[i], st[rc] += lz[i];
    lz[lc] += lz[i], lz[rc] += lz[i];
    lz[i] = 0;
  }
  void radd(int ql, int qr, int v, int i = 1, int tl = 0, int tr = -1) {
    if (tr < 0)
      tr += size(st) >> 2;
    if (tl > qr || tr < ql)
      return;
    if (ql <= tl && tr <= qr)
      st[i] += v, lz[i] += v;
    else {
      push(i);
      int tm = tl + tr >> 1;
      radd(ql, qr, v, lc, tl, tm);
      radd(ql, qr, v, rc, tm+1, tr);
      st[i] = min(st[lc], st[rc]);
    }
  }
  #undef lc
  #undef rc
};

struct ST2 {
  vt<array<int, 5>> st;
  vt<int> lz;
  ST2(int n) {
    st.resize(n<<2);
    lz.resize(n<<2);
    build();
  }
  #define lc i << 1
  #define rc i << 1 | 1
  array<int, 5> merge(array<int, 5> &a, array<int, 5> &b) {
    // value, prefix, suffix, length, answer
    if (a < b)
      return {a[0], a[1], 0, a[3] + b[3], max(a[4], b[4])};
    if (a > b)
      return {b[0], 0, b[2], a[3] + b[3], max(a[4], b[4])};
    return {a[0], a[1] + (a[1] == a[3]) * b[1], b[2] + (b[2] == b[3]) * a[2], a[3] + b[3], max({a[4], b[4], a[2] + b[1]})};
  }
  void build(int i = 1, int tl = 0, int tr = -1) {
    if (tr < 0)
      tr += size(st) >> 2;
    st[i] = {0, 1, 1, 1, 1};
    if (tl == tr)
      return;
    int tm = tl + tr >> 1;
    build(lc, tl, tm);
    build(rc, tm+1, tr);
    st[i] = merge(st[lc], st[rc]);
  }
  void push(int i) {
    if (!lz[i])
      return;
    st[lc][0] += lz[i], st[rc][0] += lz[i];
    lz[lc] += lz[i], lz[rc] += lz[i];
    lz[i] = 0;
  }
  void radd(int ql, int qr, int v, int i = 1, int tl = 0, int tr = -1) {
    if (tr < 0)
      tr += size(st) >> 2;
    if (tl > qr || tr < ql)
      return;
    if (ql <= tl && tr <= qr)
      lz[i] += v, st[i][0] += v;
    else {
      push(i);
      int tm = tl + tr >> 1;
      radd(ql, qr, v, lc, tl, tm);
      radd(ql, qr, v, rc, tm+1, tr);
      st[i] = merge(st[lc], st[rc]);
    }
  }
  #undef lc
  #undef rc
};

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int R, C, B, N;
  cin >> R >> C >> B >> N;
  int P[N], Q[N], X[N], Y[N], V[N];
  vt<ari2> ins[R], rem[R];
  FOR(i, 0, N-1) {
    int &a = P[i], &b = Q[i], &c = X[i], &d = Y[i], &v = V[i];
    cin >> a >> b >> c >> d >> v;
    ins[--a].push_back({--b, --d});
    rem[--c].push_back({b, d});
  }
  if (B) {
    int lo = 0, hi = min(R, C);
    while (lo < hi) {
      int mid = lo + hi + 1 >> 1;
      vt<ari4> evs; 
      FOR(i, 0, N-1) {
        evs.push_back({P[i], max(Q[i]-mid+1, 0), min(C-mid, Y[i]), V[i]});
        if (X[i] + mid < R)
          evs.push_back({X[i]+mid, max(Q[i]-mid+1, 0), min(C-mid, Y[i]), -V[i]});
      }
      sort(all(evs));
      ST1 st(C-mid+1);
      bool can = false;
      int j = 0;
      FOR(i, mid-1, R-1) {
        for (; j < size(evs) && evs[j][0] <= i; j++)
          st.radd(evs[j][1], evs[j][2], evs[j][3]);
        can |= st.st[1] <= B;
      }
      if (can)
        lo = mid;
      else
        hi = mid - 1;
    }
    cout << lo << '\n';
  } else {
    int j = 0, ans = 0;
    ST2 st(C);
    FOR(i, 0, R-1) {
      for (auto &[l, r] : rem[i])
        st.radd(l, r, -1);
      while (j < R && j - i <= st.st[1][4]) {
        for (auto &[l, r] : ins[j])
          st.radd(l, r, 1);
        chmax(ans, j++ - i);
      }
    }
    cout << ans << '\n';
  }
}

Compilation message

pyramid_base.cpp: In member function 'void ST1::radd(int, int, int, int, int, int)':
pyramid_base.cpp:42:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |       int tm = tl + tr >> 1;
      |                ~~~^~~~
pyramid_base.cpp: In member function 'void ST2::build(int, int, int)':
pyramid_base.cpp:76:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   76 |     int tm = tl + tr >> 1;
      |              ~~~^~~~
pyramid_base.cpp: In member function 'void ST2::radd(int, int, int, int, int, int)':
pyramid_base.cpp:97:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   97 |       int tm = tl + tr >> 1;
      |                ~~~^~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:123:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  123 |       int mid = lo + hi + 1 >> 1;
      |                 ~~~~~~~~^~~
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 600 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 1884 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 9 ms 14428 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 69 ms 141396 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 72 ms 141248 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 11 ms 1492 KB Output is correct
2 Correct 62 ms 1836 KB Output is correct
3 Correct 45 ms 1836 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 205 ms 9552 KB Output is correct
2 Correct 302 ms 10408 KB Output is correct
3 Correct 217 ms 10344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 259 ms 65228 KB Output is correct
2 Correct 86 ms 50600 KB Output is correct
3 Correct 180 ms 33536 KB Output is correct
4 Correct 652 ms 79936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 437 ms 74604 KB Output is correct
2 Correct 720 ms 82296 KB Output is correct
3 Correct 169 ms 65484 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 291 ms 66248 KB Output is correct
2 Correct 979 ms 83032 KB Output is correct
3 Correct 952 ms 82944 KB Output is correct
4 Correct 905 ms 85000 KB Output is correct
5 Correct 879 ms 82992 KB Output is correct
6 Correct 131 ms 66136 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 547 ms 156752 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 745 ms 163556 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 910 ms 170112 KB Output isn't correct
2 Halted 0 ms 0 KB -