제출 #879964

#제출 시각아이디문제언어결과실행 시간메모리
879964amin_2008Bitaro the Brave (JOI19_ho_t1)C++17
100 / 100
218 ms171200 KiB
#pragma GCC optimize ("O3")
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

// author: amin_2008

#define ios          ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define ll           long long
#define vi           vector<int>
#define vs           vector<string>
#define vc           vector<char>
#define vl           vector<ll>
#define all(v)       v.begin(), v.end()
#define rall(v)      v.rbegin(), v.rend()
#define pb           push_back
#define bpc          __builtin_popcount
#define pii          pair<int, int>
#define pll          pair<ll, ll>
#define piii         pair<pii, int>
#define vpii         vector<pii>
#define vpll         vector<pll>
#define vvpii        vector<vpii>
#define vvi          vector<vector<int>>
#define vvl          vector<vector<ll>>
#define ins          insert
#define ts           to_string
#define F            first
#define S            second
#define lb           lower_bound
#define ub           upper_bound
#define ld           long double
#define ull          unsigned long long
#define endl         '\n'
#define int          ll

using namespace std;
using namespace __gnu_pbds;
using namespace __cxx11;
template<class T> using ordered_set = tree<T, null_type,less<T>, rb_tree_tag,tree_order_statistics_node_update>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int inf = 1e18;
const int mod = 1e9+7;
const int sz = 2e5+5;
const int N = 100005;
const int logg = 18;
const int P = 40000005;
const int M = 5e5+5;

//int a[sz];
char a[3005][3005];

void solve()
{
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            cin >> a[i][j];
    vvi v(n, vi (1, 0)), p(1, vi (m, 0));
    for(int i = 0; i < n; i++)
    {
        vi vv;
        for(int j = 0; j < m; j++)
            v[i].pb(v[i].back() + ( a[i][j] == 'O' )),
            vv.pb(p.back()[j] + ( a[i][j] == 'I' ));
        p.pb(vv);
    }
    int res = 0;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            if ( a[i][j] == 'J' )
                res += ( v[i][m] - v[i][j] ) * ( p[n][j] - p[i][j] );
    cout << res << endl;
}

signed main()
{
    ios;
    //precompute();
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}

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