답안 #1095238

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1095238 2024-10-01T15:41:11 Z SoMotThanhXuan Bob (COCI14_bob) C++17
120 / 120
90 ms 13440 KB
#include <bits/stdc++.h>
using namespace std;

const int maxN = 1e3 + 5;
int a[maxN][maxN], N, M;
namespace subtask1{
    bool check(){
        return max(N, M) <= 50;
    }
    bool ok[51][51][51][51];
    void solve(){
        int res = 0;
        for(int i = 1; i <= N; ++i)for(int j = 1; j <= M; ++j)ok[i][j][i][j] = 1;
        for(int i = 1; i <= N; ++i){
            for(int j = 1; j <= M; ++j){
                for(int x = i + 1; x <= N; ++x){
                    if(a[i][j] == a[x][j]) ok[i][j][x][j] = ok[i][j][x - 1][j];
                }
                for(int y = j + 1; y <= M; ++y){
                    if(a[i][j] == a[i][y]) ok[i][j][i][y] = ok[i][j][i][y - 1];
                }
                for(int x = i + 1; x <= N; ++x){
                    for(int y = j + 1; y <= M; ++y){
                        if(a[x][y] == a[i][j]){
                            ok[i][j][x][y] = ok[i][j][x - 1][y] && ok[i][j][x][y - 1];
                        }
                    }
                }
            }
        }
        for(int i = 1; i <= N; ++i)for(int j = 1; j <= M; ++j)for(int x = i; x <= N; ++x)for(int y = j; y <= M; ++y)
        if(ok[i][j][x][y]){
            ++res;
        }
        cout << res;
    }
}
namespace subtask23{
    int nxt[maxN][maxN];
    int l[maxN], r[maxN];
    int h[maxN];
    void solve(){
        for(int i = 1; i <= N; ++i){
            for(int l = 1, r = 1; l <= M;){
                while(r <= M && a[i][l] == a[i][r])++r;
                nxt[i][l] = r;
                l = r;
            }
        }
        long long res = 0;
        for(int i = 1; i <= N; ++i){
            for(int j = 1; j <= M; ++j){
                h[j] = (a[i][j] == a[i - 1][j] ? h[j] + 1 : 1);
                l[j] = r[j] = 0;
            }
            for(int j = 1; j <= M; j = nxt[i][j]){
                stack<int> st;
                for(int k = j; k < nxt[i][j]; ++k){
                    while(!st.empty() && h[st.top()] >= h[k])st.pop();
                    if(st.empty()) l[k] = j;
                    else l[k] = st.top() + 1;
                    st.push(k);
                }
                while(!st.empty())st.pop();
                for(int k = nxt[i][j] - 1; k >= j; --k){
                    while(!st.empty() && h[st.top()] > h[k]) st.pop();
                    if(st.empty())r[k] = nxt[i][j] - 1;
                    else r[k] = st.top() - 1;
                    st.push(k);
                }
            }
            for(int j = 1; j <= M; ++j)res += 1ll * h[j] * (j - l[j] + 1) * (r[j] - j + 1);
        }
        cout << res;
    }
}
int main(){
//    freopen("s2.inp", "r", stdin);
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> N >> M;
    for(int i = 1; i <= N; ++i)
    for(int j = 1; j <= M; ++j){
        cin >> a[i][j];
    }
//    if(subtask1 :: check()) return subtask1 :: solve(), 0;
    return subtask23 :: solve(), 0;
    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 4700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 4956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 4944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 5188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 11692 KB Output is correct
2 Correct 51 ms 9380 KB Output is correct
3 Correct 41 ms 9556 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 87 ms 13396 KB Output is correct
2 Correct 47 ms 9556 KB Output is correct
3 Correct 41 ms 9556 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 13440 KB Output is correct
2 Correct 47 ms 9548 KB Output is correct
3 Correct 41 ms 9560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 13392 KB Output is correct
2 Correct 44 ms 8272 KB Output is correct
3 Correct 43 ms 8272 KB Output is correct