Submission #899465

# Submission time Handle Problem Language Result Execution time Memory
899465 2024-01-06T08:55:28 Z rxlfd314 Rectangles (IOI19_rect) C++17
0 / 100
5000 ms 50956 KB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ari2 = array<int, 2>;

#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)

struct BIT {
  vt<int> fen;
  BIT(int n) {
    fen.resize(n);
  }
  void upd(int i, int v) {
    for (; i < size(fen); i += i+1 & -i-1)
      fen[i] += v;
  }
  int qry(int i) {
    int ret = 0;
    for (; i >= 0; i -= i+1 & -i-1)
      ret += fen[i];
    return ret;
  }
  int qry(int l, int r) {
    return r < l ? 0 : qry(r) - qry(l-1);
  }
};

ll count_rectangles(vt<vt<int>> A) {
  const int N = size(A), M = size(A[0]);
  int X[N][M], Y[N][M];
  FOR(i, 0, N-1) {
    vt<int> sk;
    FOR(j, 0, M-1) {
      while (size(sk) && A[i][sk.back()] < A[i][j])
        sk.pop_back();
      X[i][j] = size(sk) ? sk.back() + 1 : 0;
      sk.push_back(j);
    }
    sk.clear();
    ROF(j, M-1, 0) {
      while (size(sk) && A[i][sk.back()] < A[i][j])
        sk.pop_back();
      Y[i][j] = size(sk) ? sk.back() - 1 : M - 1;
      sk.push_back(j);
    }
  }
  #ifdef DEBUG
  cout << "X:\n";
  FOR(i, 0, N-1)
    FOR(j, 0, M-1)
      cout << X[i][j] << "\n "[j+1<M];
  cout << "Y:\n";
  FOR(i, 0, N-1)
    FOR(j, 0, M-1)
      cout << Y[i][j] << "\n "[j+1<M];
  #endif
  
  ll ans = 0;
  FOR(l, 1, N-2) {
    int R[M], L[M], mx[M];
    memset(R, 0x3f, sizeof(R));
    memset(L, 0xc0, sizeof(L));
    memset(mx, 0xc0, sizeof(mx));
    int dead_bef = 0;
    FOR(r, l, N-2) {
      BIT fen(M);
      priority_queue<ari2, vt<ari2>, greater<ari2>> pq;
      FOR(i, 0, M-1) {
        while (size(pq) && (pq.top()[0] < i-1 || pq.top()[1] < dead_bef)) {
          fen.upd(pq.top()[1], -1);
          pq.pop();
        }
        R[i] = min(R[i], Y[r][i]);
        L[i] = max(L[i], X[r][i]);
        mx[i] = max(mx[i], A[r][i]);
        if (i && mx[i-1] < min(A[l-1][i-1], A[r+1][i-1])) {
          ans += fen.qry(L[i]-1, i-2);
          #ifdef DEBUG
          cout << "contribution from " << i-1 << ' ' << l << ' ' << r << ": " << fen.qry(L[i]-1, i-2) << '\n';
          #endif
        } else {
          dead_bef = i - 1;
        }
        pq.push({R[i], i});
        fen.upd(i, 1);
      }
    }
  }
  return ans;
}

Compilation message

rect.cpp: In member function 'void BIT::upd(int, int)':
rect.cpp:21:33: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   21 |     for (; i < size(fen); i += i+1 & -i-1)
      |                                ~^~
rect.cpp: In member function 'int BIT::qry(int)':
rect.cpp:26:26: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   26 |     for (; i >= 0; i -= i+1 & -i-1)
      |                         ~^~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 444 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 444 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 444 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 444 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 604 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Incorrect 1 ms 604 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Execution timed out 5040 ms 50956 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 444 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -