제출 #570184

#제출 시각아이디문제언어결과실행 시간메모리
570184StickfishRectangles (IOI19_rect)C++17
59 / 100
5063 ms67652 KiB
#include "rect.h"
#include <iostream>
#include <cassert>
using namespace std;
using ll = long long;

const int INF = 1e9 + 177013;

struct cell {
    short l;
    short r;
    short u;
    short d;

    cell operator+(cell a) {
        cell ans;
        ans.l = min(l, a.l);
        ans.u = min(u, a.u);
        ans.r = max(r, a.r);
        ans.d = max(d, a.d);
        return ans;
    }
};

vector<vector<cell>> cl;

ll count_rectangles(vector<vector<int>> a) {
    int n = a.size();
    int m = a[0].size();
    cl.assign(n, vector<cell>(m));
    for (int i = 0; i < n; ++i) {
        vector<pair<int, int>> stck = {{INF, -1}};
        for (int j = 0; j < m; ++j) {
            while (stck.back().first <= a[i][j])
                stck.pop_back();
            cl[i][j].l = stck.back().second;
            stck.push_back({a[i][j], j});
        }
    }
    for (int i = 0; i < n; ++i) {
        vector<pair<int, int>> stck = {{INF, m}};
        for (int j = m - 1; j >= 0; --j) {
            while (stck.back().first <= a[i][j])
                stck.pop_back();
            cl[i][j].r = stck.back().second;
            stck.push_back({a[i][j], j});
        }
    }
    for (int j = 0; j < m; ++j) {
        vector<pair<int, int>> stck = {{INF, -1}};
        for (int i = 0; i < n; ++i) {
            while (stck.back().first <= a[i][j])
                stck.pop_back();
            cl[i][j].u = stck.back().second;
            stck.push_back({a[i][j], i});
        }
    }
    for (int j = 0; j < m; ++j) {
        vector<pair<int, int>> stck = {{INF, n}};
        for (int i = n - 1; i >= 0; --i) {
            while (stck.back().first <= a[i][j])
                stck.pop_back();
            cl[i][j].d = stck.back().second;
            stck.push_back({a[i][j], i});
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            assert(cl[i][j].u == -1 || a[cl[i][j].u][j] > a[i][j]);
            assert(cl[i][j].l == -1 || a[i][cl[i][j].l] > a[i][j]);
            assert(cl[i][j].d == n || a[cl[i][j].d][j] > a[i][j]);
            assert(cl[i][j].r == m || a[i][cl[i][j].r] > a[i][j]);
        }
    }
    vector<vector<cell>> colmn(n, vector<cell>(m));
    ll ans = 0;
    for (int i = n - 2; i > 0; --i) {
        for (int j = m - 2; j > 0; --j) {
            colmn[i][j] = cl[i][j];
            for (int u = i; u < n - 1; ++u) {
                cell board = cl[i][j];
                for (int v = j; v < m - 1; ++v) {
                    if (u > i)
                        colmn[u][v] = colmn[u][v] + cl[i][v];
                    board = board + colmn[u][v];
                    if (board.u < i - 1 || board.l < j - 1 || board.d > u + 1)
                        break;
                    if (board.r <= v + 1) {
                        ++ans;
                    }
                }
            }
        }
    }
	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...