Submission #589321

#TimeUsernameProblemLanguageResultExecution timeMemory
589321MohamedFaresNebiliBitaro the Brave (JOI19_ho_t1)C++14
100 / 100
239 ms158808 KiB
#include <bits/stdc++.h>
/// #pragma GCC optimize ("Ofast")
/// #pragma GCC target ("avx2")
/// #pragma GCC optimize("unroll-loops")

                using namespace std;

                using ll = long long;
                using ld = long double;
                using ii = pair<ll, ll>;
                using vi = vector<int>;

                #define ff first
                #define ss second
                #define pb push_back
                #define all(x) (x).begin(), (x).end()
                #define lb lower_bound
                #define int ll
                #define double ld

                const int MOD = 1000 * 1000 * 1000 + 7;
                const double EPS = 1e-9;

                int H, W, A[3001][3001], B[3001][3001];
                char grid[3001][3001]; int DP[3001][3001][2];

                int32_t main() {
                    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
                    cin >> H >> W;
                    for(int l = 1; l <= H; l++)
                        for(int i = 1; i <= W; i++)
                            cin >> grid[l][i];
                    int res = 0;
                    for(int l = 1; l <= H; l++) {
                        for(int i = 1; i <= W; i++) {
                            DP[l][i][0] = (grid[l][i] == 'O');
                            DP[l][i][1] = (grid[l][i] == 'I');

                            DP[l][i][0] += DP[l - 1][i][0],
                            DP[l][i][1] += DP[l - 1][i][1];

                            DP[l][i][0] += DP[l][i - 1][0],
                            DP[l][i][1] += DP[l][i - 1][1];

                            DP[l][i][0] -= DP[l - 1][i - 1][0],
                            DP[l][i][1] -= DP[l - 1][i - 1][1];
                        }
                    }
                    for(int l = 1; l <= H; l++) {
                        for(int i = 1; i <= W; i++) {
                            if(grid[l][i] != 'J') continue;
                            int U = DP[l][W][0] - DP[l][i - 1][0] - DP[l - 1][W][0] + DP[l - 1][i - 1][0];
                            int V = DP[H][i][1] - DP[H][i - 1][1] - DP[l - 1][i][1] + DP[l - 1][i - 1][1];
                            res += U * V;
                        }
                    }
                    cout << res << "\n";
                    return 0;
                }

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...