Submission #1143647

#TimeUsernameProblemLanguageResultExecution timeMemory
1143647RufatBitaro the Brave (JOI19_ho_t1)C++20
100 / 100
216 ms80956 KiB
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int H, W;
    cin >> H >> W;
    vector<string> grid(H);
    for (int i = 0; i < H; i++){
        cin >> grid[i];
    }
    
    // Precompute for each row: rightO[i][j] = number of 'O's in row i in columns j+1...W-1.
    vector<vector<int>> rightO(H, vector<int>(W, 0));
    for (int i = 0; i < H; i++){
        // Last column: no cell to its right.
        rightO[i][W-1] = 0;
        for (int j = W - 2; j >= 0; j--){
            rightO[i][j] = rightO[i][j+1] + (grid[i][j+1] == 'O');
        }
    }
    
    // Precompute for each column: downI[i][j] = number of 'I's in column j in rows i+1...H-1.
    // We use a 2D array downI with same dimensions.
    vector<vector<int>> downI(H, vector<int>(W, 0));
    for (int j = 0; j < W; j++){
        // Last row: no cell below.
        downI[H-1][j] = 0;
        for (int i = H - 2; i >= 0; i--){
            downI[i][j] = downI[i+1][j] + (grid[i+1][j] == 'I');
        }
    }
    
    // Count the number of quadruplets.
    long long ans = 0;
    for (int i = 0; i < H; i++){
        for (int j = 0; j < W; j++){
            if (grid[i][j] == 'J') {
                // For top-left (i,j) with a jewel, multiply
                // the number of orbs to its right in the same row and
                // the number of ingots below in the same column.
                ans += (long long) rightO[i][j] * downI[i][j];
            }
        }
    }
    
    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...