Submission #725399

#TimeUsernameProblemLanguageResultExecution timeMemory
725399t6twotwoRectangles (IOI19_rect)C++17
0 / 100
1 ms468 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> F(vector<int> A) {
    int N = A.size();
    vector<int> B(N, -1), stk;
    for (int i = 0; i < N; i++) {
        while (!stk.empty() && (A[stk.back()] < A[i])) {
            stk.pop_back();
        }
        if (!stk.empty()) {
            B[i] = stk.back();
        }
        stk.push_back(i);
    }
    return B;
}
vector<int> G(vector<int> A) {
    int N = A.size();
    vector<int> B(N);
    for (int i = 0; i < N; i++) {
        B[N - 1 - i] = N - 1 - A[i];
    }
    return B;
}
const int emax = -1;
int fmax(int x, int y) {
    return max(x, y);
}
const int emin = 3000;
int fmin(int x, int y) {
    return min(x, y);
}
const int N = 2500;
int lg[N + 1];
void init() {
    lg[1] = 0;
    for (int i = 2; i <= N; i++) {
        lg[i] = lg[i / 2] + 1;
    }
}
template <int (*f)(int, int), int e>
struct sparse_table {
    int n;
    vector<vector<int>> st;
    sparse_table() {
    }
    sparse_table(vector<int> a) : n(a.size()) {
        st = vector(n, vector<int>(lg[n] + 1, e));
        for (int i = 0; i < n; i++) {
            st[i][0] = a[i];
        }
        for (int j = 0; j < lg[n]; j++) {
            for (int i = 0; i + (2 << j) <= n; i++) {
                st[i][j + 1] = f(st[i][j], st[i + (1 << j)][j]);
            }
        }
    }
    int query(int l, int r) {
        assert(l <= r);
        if (l == r) {
            return e;
        }
        int k = lg[r - l];
        return f(st[l][k], st[r - (1 << k)][k]);
    }
};
using smin = sparse_table<fmin, emin>;
using smax = sparse_table<fmax, emax>;
long long count_rectangles(vector<vector<int>> A) {
    return lg[1000000];
    init();
    int N = A.size();
    int M = A[0].size();
    vector B(M, vector<int>(N));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            B[j][i] = A[i][j];
        }
    }
    vector<vector<int>> L(N), R(N);
    for (int i = 0; i < N; i++) {
        L[i] = F(A[i]);
        R[i] = G(F(vector(A[i].rbegin(), A[i].rend())));
        for (int j = 0; j < M; j++) {
            assert(L[i][j] >= -1 && L[i][j] < M);
            assert(R[i][j] >= 0 && R[i][j] <= M);
        }
    }
    vector<vector<int>> U(M), D(M);
    for (int j = 0; j < M; j++) {
        U[j] = F(B[j]);
        D[j] = G(F(vector(B[j].rbegin(), B[j].rend())));
        for (int i = 0; i < N; i++) {
            assert(U[j][i] >= -1 && U[j][i] < N);
            assert(D[j][i] >= 0 && D[j][i] <= N);
        }
    }
    vector<smax> SL(M);
    vector<smin> SR(M);
    for (int j = 0; j < M; j++) {
        vector<int> AL(N), AR(N);
        for (int i = 0; i < N; i++) {
            AL[i] = L[i][j];
            AR[i] = R[i][j];
        }
        SL[j] = smax(AL);
        SR[j] = smin(AR);
    }
    vector<smax> SU(N);
    vector<smin> SD(N);
    for (int i = 0; i < N; i++) {
        vector<int> AU(M), AD(M);
        for (int j = 0; j < M; j++) {
            AU[j] = U[j][i];
            AD[j] = D[j][i];
        }
        SU[i] = smax(AU);
        SD[i] = smin(AD);
    }
    int ans = 0;
    auto check = [&](int x1, int x2, int y1, int y2) {
        if (SR[y1 - 1].query(x1, x2) < y2) return;
        if (SD[x1 - 1].query(y1, y2) < x2) return;
        if (SL[y2].query(x1, x2) >= y1) return;
        if (SU[x2].query(y1, y2) >= x1) return;
        ans++;
    };
    for (int i = 1; i < N - 1; i++) {
        for (int j = 1; j < M - 1; j++) {
            if (N - i >= M - j && 0) {
                int u = R[i][j - 1];
                int v = L[i][j + 1];
                for (int k = i + 1; k < N; k++) {
                    if (j < u && u < M) {
                        check(i, k, j, u);
                    }
                    if (0 <= v && v < j && A[i][j + 1] != A[i][v]) {
                        check(i, k, v + 1, j + 1);
                    }
                }
            } else {
                int u = D[j][i - 1];
                int v = U[j][i + 1];
                for (int k = j + 1; k < M; k++) {
                    if (i < u && u < N) {
                        check(i, u, j, k);
                    }
                    if (0 <= v && v < i && A[i + 1][j] != A[v][j]) {
                        check(v + 1, i + 1, j, k);
                    }
                }
            }
        }
    }
    return ans;
}

Compilation message (stderr)

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:71:22: warning: array subscript 1000000 is above array bounds of 'int [2501]' [-Warray-bounds]
   71 |     return lg[1000000];
      |            ~~~~~~~~~~^
rect.cpp:35:5: note: while referencing 'lg'
   35 | int lg[N + 1];
      |     ^~
#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...