Submission #1180228

#TimeUsernameProblemLanguageResultExecution timeMemory
1180228miniobSandcastle 2 (JOI22_ho_t5)C++20
100 / 100
1734 ms258664 KiB
#include <bits/stdc++.h> using namespace std; int cura[5][5]; int n, m; int main() { cin >> n >> m; bool czy_obr = false; if(n > m) { czy_obr = true; swap(n, m); } int a[n + 7][m + 7]; int ile_wchodzi[n + 7][m + 7][3][3][3][3];//gora dol lewo prawo int ile_wchodzi_pref[n + 7][m + 7][3][3][3][3];//gora dol lewo prawo int pref[m + 7][9];//gora dol lewo prawo if(!czy_obr) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { cin >> a[i][j]; } } } else { for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { cin >> a[n - j + 1][i]; } } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { for(int gora = 0; gora < 3; gora++) { for(int dol = 0; dol < 3; dol++) { for(int lewo = 0; lewo < 3; lewo++) { for(int prawo = 0; prawo < 3; prawo++) { for(int i2 = 0; i2 < 5; i2++) { for(int j2 = 0; j2 < 5; j2++) { cura[i2][j2] = -1; } } cura[2][2] = a[i][j]; if(gora >= 1 && i + 1 <= n) { cura[3][2] = a[i + 1][j]; } if(gora == 2 && i + 2 <= n) { cura[4][2] = a[i + 2][j]; } if(dol >= 1 && i - 1 >= 1) { cura[1][2] = a[i - 1][j]; } if(dol == 2 && i - 2 >= 1) { cura[0][2] = a[i - 2][j]; } if(prawo >= 1 && j + 1 <= m) { cura[2][3] = a[i][j + 1]; } if(prawo == 2 && j + 2 <= m) { cura[2][4] = a[i][j + 2]; } if(lewo >= 1 && j - 1 >= 1) { cura[2][1] = a[i][j - 1]; } if(lewo == 2 && j - 2 >= 1) { cura[2][0] = a[i][j - 2]; } if(lewo >= 1 && j - 1 >= 1 && gora >= 1 && i + 1 <= n) { cura[3][1] = a[i + 1][j - 1]; } if(lewo >= 1 && j - 1 >= 1 && dol >= 1 && i - 1 >= 1) { cura[1][1] = a[i - 1][j - 1]; } if(prawo >= 1 && j + 1 <= m && gora >= 1 && i + 1 <= n) { cura[3][3] = a[i + 1][j + 1]; } if(prawo >= 1 && j + 1 <= m && dol >= 1 && i - 1 >= 1) { cura[1][3] = a[i - 1][j + 1]; } /*if(i == 3 && j == 1 && gora == 0 && dol == 1 && lewo == 0 && prawo == 1) { for(int i2 = 0; i2 < 5; i2++) { for(int j2 = 0; j2 < 5; j2++) { cout << cura[i2][j2] << " "; } cout << endl; } }*/ vector<pair<int,int>> sas; sas.push_back({1, 0}); sas.push_back({-1, 0}); sas.push_back({0, 1}); sas.push_back({0, -1}); int curi, curj; curi = curj = 2; for(auto x : sas) { curi += x.first; curj += x.second; int maxm = 0; int curwys = cura[curi][curj]; for(auto y : sas) { curi += y.first; curj += y.second; if(cura[curi][curj] != -1 && cura[curi][curj] < curwys) { maxm = max(maxm, cura[curi][curj]); } curi -= y.first; curj -= y.second; } if(cura[curi][curj] == -1) { maxm = -2137; } /*if(i == 3 && j == 1 && gora == 0 && dol == 1 && lewo == 0 && prawo == 1) { cout << cura[curi][curj] << " " << minw << endl; }*/ curi -= x.first; curj -= x.second; if(cura[2][2] == maxm) { ile_wchodzi[i][j][gora][dol][lewo][prawo]++; } } /*if(i == 2 && j == 1 && gora == 1 && dol == 0 && lewo == 0 && prawo == 0) { cout << ile_wchodzi[i][j][gora][dol][lewo][prawo] << endl; }*/ if(ile_wchodzi[i][j][gora][dol][lewo][prawo] != 1) { ile_wchodzi[i][j][gora][dol][lewo][prawo] = 1; } else { ile_wchodzi[i][j][gora][dol][lewo][prawo] = 0; } } } } } } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { for(int gora = 0; gora < 3; gora++) { for(int dol = 0; dol < 3; dol++) { for(int lewo = 0; lewo < 3; lewo++) { for(int prawo = 0; prawo < 3; prawo++) { ile_wchodzi_pref[i][j][gora][dol][lewo][prawo] = ile_wchodzi_pref[i - 1][j][gora][dol][lewo][prawo] + ile_wchodzi[i][j][gora][dol][lewo][prawo]; } } } } } } int odp = 0; //cout << czymoze(ile_wchodzi, 2, 1, 3, 2) << endl; for(int i = 1; i <= n; i++) { for(int i2 = i; i2 <= n; i2++) { int lewlew[m + 7]; int lewpraw[m + 7]; int prawlew[m + 7]; int prawpraw[m + 7]; int lewm[m + 7]; int prawm[m + 7]; int sr[m + 7]; int srm[m + 7]; int sama_kol[m + 7]; int srpref[m + 7]; srpref[0] = 0; map<int, int> f; queue<int> q; for(int j = 1; j <= m; j++) { if(i2 - i == 0) { lewlew[j] = ile_wchodzi[i][j][0][0][0][2]; lewpraw[j] = ile_wchodzi[i][j][0][0][1][2]; prawlew[j] = ile_wchodzi[i][j][0][0][2][1]; prawpraw[j] = ile_wchodzi[i][j][0][0][2][0]; lewm[j] = ile_wchodzi[i][j][0][0][0][1]; prawm[j] = ile_wchodzi[i][j][0][0][1][0]; sr[j] = ile_wchodzi[i][j][0][0][2][2]; srm[j] = ile_wchodzi[i][j][0][0][1][1]; sama_kol[j] = 1; srpref[j] = srpref[j - 1] + sr[j]; } if(i2 - i == 1) { lewlew[j] = ile_wchodzi[i + 1][j][0][1][0][2] + ile_wchodzi[i][j][1][0][0][2]; lewpraw[j] = ile_wchodzi[i + 1][j][0][1][1][2] + ile_wchodzi[i][j][1][0][1][2]; prawlew[j] = ile_wchodzi[i + 1][j][0][1][2][1] + ile_wchodzi[i][j][1][0][2][1]; prawpraw[j] = ile_wchodzi[i + 1][j][0][1][2][0] + ile_wchodzi[i][j][1][0][2][0]; lewm[j] = ile_wchodzi[i + 1][j][0][1][0][1] + ile_wchodzi[i][j][1][0][0][1]; prawm[j] = ile_wchodzi[i + 1][j][0][1][1][0] + ile_wchodzi[i][j][1][0][1][0]; sr[j] = ile_wchodzi[i + 1][j][0][1][2][2] + ile_wchodzi[i][j][1][0][2][2]; srm[j] = ile_wchodzi[i + 1][j][0][1][1][1] + ile_wchodzi[i][j][1][0][1][1]; sama_kol[j] = 1; srpref[j] = srpref[j - 1] + sr[j]; } if(i2 - i == 2) { lewlew[j] = ile_wchodzi[i + 2][j][0][2][0][2] + ile_wchodzi[i + 1][j][1][1][0][2] + ile_wchodzi[i][j][2][0][0][2]; lewpraw[j] = ile_wchodzi[i + 2][j][0][2][1][2] + ile_wchodzi[i + 1][j][1][1][1][2] + ile_wchodzi[i][j][2][0][1][2]; prawlew[j] = ile_wchodzi[i + 2][j][0][2][2][1] + ile_wchodzi[i + 1][j][1][1][2][1] + ile_wchodzi[i][j][2][0][2][1]; prawpraw[j] = ile_wchodzi[i + 2][j][0][2][2][0] + ile_wchodzi[i + 1][j][1][1][2][0] + ile_wchodzi[i][j][2][0][2][0]; lewm[j] = ile_wchodzi[i + 2][j][0][2][0][1] + ile_wchodzi[i + 1][j][1][1][0][1] + ile_wchodzi[i][j][2][0][0][1]; prawm[j] = ile_wchodzi[i + 2][j][0][2][1][0] + ile_wchodzi[i + 1][j][1][1][1][0] + ile_wchodzi[i][j][2][0][1][0]; sr[j] = ile_wchodzi[i + 2][j][0][2][2][2] + ile_wchodzi[i + 1][j][1][1][2][2] + ile_wchodzi[i][j][2][0][2][2]; srm[j] = ile_wchodzi[i + 2][j][0][2][1][1] + ile_wchodzi[i + 1][j][1][1][1][1] + ile_wchodzi[i][j][2][0][1][1]; sama_kol[j] = ile_wchodzi[i + 2][j][0][2][0][0] + ile_wchodzi[i + 1][j][1][1][0][0] + ile_wchodzi[i][j][2][0][0][0]; srpref[j] = srpref[j - 1] + sr[j]; } if(i2 - i == 3) { lewlew[j] = ile_wchodzi[i + 3][j][0][2][0][2] + ile_wchodzi[i + 2][j][1][2][0][2] + ile_wchodzi[i + 1][j][2][1][0][2] + ile_wchodzi[i][j][2][0][0][2]; lewpraw[j] = ile_wchodzi[i + 3][j][0][2][1][2] + ile_wchodzi[i + 2][j][1][2][1][2] + ile_wchodzi[i + 1][j][2][1][1][2] + ile_wchodzi[i][j][2][0][1][2]; prawlew[j] = ile_wchodzi[i + 3][j][0][2][2][1] + ile_wchodzi[i + 2][j][1][2][2][1] + ile_wchodzi[i + 1][j][2][1][2][1] + ile_wchodzi[i][j][2][0][2][1]; prawpraw[j] = ile_wchodzi[i + 3][j][0][2][2][0] + ile_wchodzi[i + 2][j][1][2][2][0] + ile_wchodzi[i + 1][j][2][1][2][0] + ile_wchodzi[i][j][2][0][2][0]; lewm[j] = ile_wchodzi[i + 3][j][0][2][0][1] + ile_wchodzi[i + 2][j][1][2][0][1] + ile_wchodzi[i + 1][j][2][1][0][1] + ile_wchodzi[i][j][2][0][0][1]; prawm[j] = ile_wchodzi[i + 3][j][0][2][1][0] + ile_wchodzi[i + 2][j][1][2][1][0] + ile_wchodzi[i + 1][j][2][1][1][0] + ile_wchodzi[i][j][2][0][1][0]; sr[j] = ile_wchodzi[i + 3][j][0][2][2][2] + ile_wchodzi[i + 2][j][1][2][2][2] + ile_wchodzi[i + 1][j][2][1][2][2] + ile_wchodzi[i][j][2][0][2][2]; srm[j] = ile_wchodzi[i + 3][j][0][2][1][1] + ile_wchodzi[i + 2][j][1][2][1][1] + ile_wchodzi[i + 1][j][2][1][1][1] + ile_wchodzi[i][j][2][0][1][1]; sama_kol[j] = ile_wchodzi[i + 3][j][0][2][0][0] + ile_wchodzi[i + 2][j][1][2][0][0] + ile_wchodzi[i + 1][j][2][1][0][0] + ile_wchodzi[i][j][2][0][0][0]; srpref[j] = srpref[j - 1] + sr[j]; } if(i2 - i > 3) { lewlew[j] = ile_wchodzi[i2][j][0][2][0][2] + ile_wchodzi[i2 - 1][j][1][2][0][2] + ile_wchodzi_pref[i2 - 2][j][2][2][0][2] - ile_wchodzi_pref[i + 1][j][2][2][0][2] + ile_wchodzi[i + 1][j][2][1][0][2] + ile_wchodzi[i][j][2][0][0][2]; lewpraw[j] = ile_wchodzi[i2][j][0][2][1][2] + ile_wchodzi[i2 - 1][j][1][2][1][2] + ile_wchodzi_pref[i2 - 2][j][2][2][1][2] - ile_wchodzi_pref[i + 1][j][2][2][1][2] + ile_wchodzi[i + 1][j][2][1][1][2] + ile_wchodzi[i][j][2][0][1][2]; prawlew[j] = ile_wchodzi[i2][j][0][2][2][1] + ile_wchodzi[i2 - 1][j][1][2][2][1] + ile_wchodzi_pref[i2 - 2][j][2][2][2][1] - ile_wchodzi_pref[i + 1][j][2][2][2][1] + ile_wchodzi[i + 1][j][2][1][2][1] + ile_wchodzi[i][j][2][0][2][1]; prawpraw[j] = ile_wchodzi[i2][j][0][2][2][0] + ile_wchodzi[i2 - 1][j][1][2][2][0] + ile_wchodzi_pref[i2 - 2][j][2][2][2][0] - ile_wchodzi_pref[i + 1][j][2][2][2][0] + ile_wchodzi[i + 1][j][2][1][2][0] + ile_wchodzi[i][j][2][0][2][0]; lewm[j] = ile_wchodzi[i2][j][0][2][0][1] + ile_wchodzi[i2 - 1][j][1][2][0][1] + ile_wchodzi_pref[i2 - 2][j][2][2][0][1] - ile_wchodzi_pref[i + 1][j][2][2][0][1] + ile_wchodzi[i + 1][j][2][1][0][1] + ile_wchodzi[i][j][2][0][0][1]; prawm[j] = ile_wchodzi[i2][j][0][2][1][0] + ile_wchodzi[i2 - 1][j][1][2][1][0] + ile_wchodzi_pref[i2 - 2][j][2][2][1][0] - ile_wchodzi_pref[i + 1][j][2][2][1][0] + ile_wchodzi[i + 1][j][2][1][1][0] + ile_wchodzi[i][j][2][0][1][0]; sr[j] = ile_wchodzi[i2][j][0][2][2][2] + ile_wchodzi[i2 - 1][j][1][2][2][2] + ile_wchodzi_pref[i2 - 2][j][2][2][2][2] - ile_wchodzi_pref[i + 1][j][2][2][2][2] + ile_wchodzi[i + 1][j][2][1][2][2] + ile_wchodzi[i][j][2][0][2][2]; srm[j] = ile_wchodzi[i2][j][0][2][1][1] + ile_wchodzi[i2 - 1][j][1][2][1][1] + ile_wchodzi_pref[i2 - 2][j][2][2][1][1] - ile_wchodzi_pref[i + 1][j][2][2][1][1] + ile_wchodzi[i + 1][j][2][1][1][1] + ile_wchodzi[i][j][2][0][1][1]; sama_kol[j] = ile_wchodzi[i2][j][0][2][0][0] + ile_wchodzi[i2 - 1][j][1][2][0][0] + ile_wchodzi_pref[i2 - 2][j][2][2][0][0] - ile_wchodzi_pref[i + 1][j][2][2][0][0] + ile_wchodzi[i + 1][j][2][1][0][0] + ile_wchodzi[i][j][2][0][0][0]; srpref[j] = srpref[j - 1] + sr[j]; } } q.push(lewlew[1] + lewpraw[2] - srpref[2]); for(int j = 1; j <= m; j++) { if(sama_kol[j] == 1) { odp++; } } for(int j = 1; j <= m - 1; j++) { if(lewm[j] + prawm[j + 1] == 1) { odp++; } } for(int j = 1; j <= m - 2; j++) { if(lewlew[j] + srm[j + 1] + prawpraw[j + 2] == 1) { odp++; } } for(int j = 4; j <= m; j++) { int cur = q.front(); q.pop(); f[cur]++; cur = prawpraw[j] + prawlew[j - 1] + srpref[j - 2]; odp += f[1 - cur]; q.push(lewlew[j - 2] + lewpraw[j - 1] - srpref[j - 1]); } } } cout << odp << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...