Submission #594184

#TimeUsernameProblemLanguageResultExecution timeMemory
594184piOOESandcastle 2 (JOI22_ho_t5)C++17
24 / 100
5091 ms724 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    bool swapped = false;
    if (n > m) {
        swapped = true;
        swap(n, m);
    }
    vector<vector<int>> a(n, vector<int>(m));
    for (int i = 0; i < (swapped ? m : n); ++i) {
        for (int j = 0; j < (swapped ? n : m); ++j) {
            if (!swapped) {
                cin >> a[i][j];
            } else {
                cin >> a[j][i];
            }
        }
    }
    auto adj = [](int x1, int y1, int x2, int y2) {
        return abs(x1 - x2) + abs(y1 - y2) < 2;
    };
    ll ans = 0;
    if (n == 1) {
        for (int i = 0; i < m;) {
            int j = i + 1;
            while (j < m && a[0][j] < a[0][j - 1]) {
                j += 1;
            }
            int len = j - i;
            ans += len * ((ll)len - 1) / 2;
            i = j;
        }

        for (int i = m - 1; i > -1;) {
            int j = i - 1;
            while (j > -1 && a[0][j] < a[0][j + 1]) {
                j -= 1;
            }
            int len = i - j;
            ans += len * ((ll)len - 1) / 2;
            i = j;
        }
        ans += m;
        cout << ans;
        return 0;
    }
    for (int x1 = 0; x1 < n; ++x1) {
        for (int y1 = 0; y1 < m; ++y1) {
            for (int x2 = x1; x2 < n; ++x2) {
                set<array<int, 3>> st;
                int cnt = 0;
                for (int y2 = y1; y2 < m; ++y2) {
                    for (int x = x1; x <= x2; ++x) {
                        auto it = st.lower_bound({a[x][y2], -1, -1});
                        if (it != st.end()) {
                            if (it != st.begin()) {
                                cnt -= !adj((*it)[1], (*it)[2], (*prev(it))[1], (*prev(it))[2]);
                            }
                            cnt += !adj(x, y2, (*it)[1], (*it)[2]);
                        }
                        if (it != st.begin()) {
                            it = prev(it);
                            cnt += !adj(x, y2, (*it)[1], (*it)[2]);
                        }
                        st.insert({a[x][y2], x, y2});
                    }
                    ans += cnt == 0;
                }
            }
        }
    }
    cout << ans;
    return 0;
}
#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...