Submission #683122

# Submission time Handle Problem Language Result Execution time Memory
683122 2023-01-17T18:36:06 Z Ahmed57 Bob (COCI14_bob) C++14
120 / 120
150 ms 17956 KB
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n , m ;
    scanf("%d %d" , &n , &m) ;
    int arr[n+2][m+2] , now[n+2][m+2];
    for(int i = 1 ; i <= n ; ++i)
    {
        for(int j = 1 ; j <= m ; ++j)
            scanf("%d" , &arr[i][j]) ;
    }
    //prepare now for every element
    for(int i = 1 ; i <= n ; ++i)
    {
        now[i][m] = 1ll ;
        for(int j = m-1 ; j >= 1 ; --j)
        {
            if(arr[i][j] == arr[i][j+1])
                now[i][j] = now[i][j+1] + 1ll;
            else
                now[i][j] = 1ll ;
        }
    }
    long long ans = 0ll ;
    long long sol[n+2][m+2] ;
    //loop on every column
    for(int j = 1 ; j <= m ; ++j)
    {
        arr[0][j] = -1 ;
        stack< pair<int , int> >s ;
        for(int i = 1 ; i <= n ; ++i)
        {
            pair<int , int>cur ;
            cur.first = i , cur.second = 1ll ;
            sol[i][j] = 0ll ;
            //new value
            if(arr[i][j] != arr[i-1][j])
            {
                while(!s.empty())
                    s.pop() ;
                sol[i][j] = now[i][j] * 1ll;
                ans += sol[i][j] ;
                s.push(cur) ;
                continue ;
            }
            //loop in stack
            while(!s.empty() && now[s.top().first][j] >= now[i][j])
            {
                pair<int , int>p = s.top() ;
                s.pop() ;
                cur.second += p.second ;
            }
            sol[i][j] = (cur.second * 1ll * now[i][j]) ;
            if(s.size() > 0)
            {
                pair<int , int>p = s.top() ;
                sol[i][j] += sol[p.first][j] ;
            }
            ans += sol[i][j] ;
            s.push(cur) ;
        }
    }
    return printf("%lld" , ans) , 0 ;
}

Compilation message

bob.cpp: In function 'int main()':
bob.cpp:8:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
    8 |     scanf("%d %d" , &n , &m) ;
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
bob.cpp:13:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |             scanf("%d" , &arr[i][j]) ;
      |             ~~~~~^~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 304 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 35 ms 4788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 4796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 4764 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 4804 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 116 ms 16580 KB Output is correct
2 Correct 105 ms 17956 KB Output is correct
3 Correct 111 ms 17948 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 136 ms 16436 KB Output is correct
2 Correct 101 ms 17872 KB Output is correct
3 Correct 113 ms 17892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 150 ms 16372 KB Output is correct
2 Correct 96 ms 17836 KB Output is correct
3 Correct 105 ms 17912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 135 ms 16376 KB Output is correct
2 Correct 102 ms 17892 KB Output is correct
3 Correct 92 ms 17836 KB Output is correct