Submission #725289

#TimeUsernameProblemLanguageResultExecution timeMemory
725289t6twotwoRectangles (IOI19_rect)C++17
10 / 100
8 ms572 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), stk{-1};
    for (int i = 0; i < N; i++) {
        while (stk.back() != -1 && (A[stk.back()] < A[i])) {
            stk.pop_back();
        }
        B[i] = stk.back();
        stk.push_back(i);
    }
    return B;
}
vector<int> R(vector<int> A) {
    int N = A.size();
    vector<int> B(N);
    for (int i = 0; i < N; i++) {
        if (A[i] == -1) {
            B[N - 1 - i] = -1;
        } else {
            B[N - 1 - i] = N - 1 - A[i];
        }
    }
    return B;
}
long long count_rectangles(vector<vector<int>> A) {
    int N = A.size();
    int M = A[0].size();
    int ans = 0, D1 = 0, D2 = 0;
    for (int mask = 0; mask < 4; mask++) {
        vector A2(N, vector<int>(M));
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                A2[mask % 2 == 0 ? i : N - 1 - i][mask / 2 % 2 == 0 ? j : M - 1 - j] = A[i][j];
            }
        }
        swap(A, A2);
        vector<vector<int>> X(N), XR(N);
        for (int i = 0; i < N; i++) {
            X[i] = R(F(vector(A[i].rbegin(), A[i].rend())));
            XR[i] = F(A[i]);
        }
        vector Y(N, vector<int>(M));
        vector YR(N, vector<int>(M));
        for (int j = 0; j < M; j++) {
            vector<int> B(N);
            for (int i = 0; i < N; i++) {
                B[i] = A[i][j];
            }
            auto C = R(F(vector(B.rbegin(), B.rend())));
            auto D = F(B);
            for (int i = 0; i < N; i++) {
                Y[i][j] = C[i];
                YR[i][j] = D[i];
            }
        }
        for (int j = 1; j < M - 1; j++) {
            for (int i = 1; i < N - 1; i++) {
                if (X[i][j - 1] == -1 || X[i][j - 1] == j) {
                    continue;
                }
                int k = i;
                while (k < N - 1 && (X[k][j - 1] == X[i][j - 1] || XR[k][X[i][j - 1]] == j - 1)) {
                    k++;
                }
                for (int x = i; x < k; x++) {
                    if (X[x][j - 1] != X[i][j - 1] || Y[x - 1][j] == -1 || Y[x - 1][j] > k || Y[x - 1][j] == x) {
                        continue;
                    }
                    bool ok = 1;
                    for (int y = j; y < X[i][j - 1]; y++) {
                        if (!(Y[x - 1][y] == Y[x - 1][j] || YR[Y[x - 1][j]][y] == x - 1)) {
                            ok = 0;
                        }
                    }
                    if (ok) {
                        ans++;
                        bool u = A[x][j - 1] == A[x][X[x][j - 1]];
                        bool v = A[x - 1][j] == A[Y[x - 1][j]][j];
                        if (u && v) {
                            D2++;
                        } else if (u || v) {
                            D1++;
                        }
                    }
                }
            }
        }
        swap(A, A2);
    }
    ans -= D1;
    ans -= 3 * D2;
    return ans;
}
#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...