Submission #899478

# Submission time Handle Problem Language Result Execution time Memory
899478 2024-01-06T09:22:59 Z rxlfd314 Rectangles (IOI19_rect) C++17
0 / 100
1 ms 604 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#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;
  int R[M], L[M], mx[M];
  FOR(l, 1, N-2) {
    memset(R, 0x3f, sizeof(R));
    memset(L, 0xc0, sizeof(L));
    memset(mx, 0xc0, sizeof(mx));
    FOR(r, l, N-2) {
      int ord[M];
      iota(ord, ord+M, 0);
      sort(ord, ord+M, [&](const int &a, const int &b) {
        return R[a] < R[b];    
      });
      BIT fen(M);
      priority_queue<ari2, vt<ari2>, greater<ari2>> ma;
      int dead_bef = 0, j = 0, k = 0;
      bool dead[M] = {};
      FOR(i, 0, M-1) {
        for (; k < M && R[ord[k]] < i-1; k++)
          if (!dead[ord[k]]) {
            dead[ord[k]] = true;
            fen.upd(ord[k], -1);
          }
        for (; j < dead_bef; j++)
          if (!dead[j]) {
            fen.upd(j, -1);
            dead[j] = true;
          }
        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;
        }
        ma.push({R[i], i});
        fen.upd(i, 1);
      }
    }
  }
  return ans;
}

Compilation message

rect.cpp: In member function 'void BIT::upd(int, int)':
rect.cpp:23:33: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   23 |     for (; i < size(fen); i += i+1 & -i-1)
      |                                ~^~
rect.cpp: In member function 'int BIT::qry(int)':
rect.cpp:28:26: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   28 |     for (; i >= 0; i -= i+1 & -i-1)
      |                         ~^~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 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 348 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 344 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 348 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 344 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 348 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 344 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 348 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 600 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 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 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 348 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Halted 0 ms 0 KB -