Submission #1215177

#TimeUsernameProblemLanguageResultExecution timeMemory
1215177jasonicRectangles (IOI19_rect)C++20
0 / 100
3681 ms79192 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fastIO cin.tie(0); ios::sync_with_stdio(false) int r, c; const int dx[4] = {1, -1, 0, 0}; const int dy[4] = {0, 0, 1, -1}; ll count_rectangles(vector<vector<int>> arr) { r = size(arr); c = size(arr[0]); vector<vector<int>> maxUp(r, vector<int>(c, -1)); vector<vector<int>> maxDown(r, vector<int>(c, -1)); vector<vector<int>> maxLeft(r, vector<int>(c, -1)); vector<vector<int>> maxRight(r, vector<int>(c, -1)); for(int y = 0; y < r; y++) { for(int x = 0; x < c; x++) { int xl = x-1, xr = x+1; int yu = y-1, yd = y+1; for(; xl >= 0; xl--) if(arr[y][xl] > arr[y][x]) break; for(; xr < c; xr++) if(arr[y][xr] > arr[y][x]) break; for(; yu >= 0; yu--) if(arr[yu][x] > arr[y][x]) break; for(; yd < r; yd++) if(arr[yd][x] > arr[y][x]) break; maxUp[y][x] = yu; maxDown[y][x] = yd; maxLeft[y][x] = xl; maxRight[y][x] = xr; } } vector<vector<int>> vis(r, vector<int>(c, 0)); int thing = 1; ll ans = 0; for(int y = 1; y < r-1; y++) { for(int x = 1; x < c-1; x++) { int mnX = maxLeft[y][x], mxX = maxRight[y][x], mxY = maxDown[y][x], mnY = maxUp[y][x]; int mnX2, mxX2, mnY2, mxY2; mnX2 = mxX2 = x; mnY2 = mxY2 = y; vis[y][x] = thing; int sz = 1; queue<pair<int, int>> bfs; bfs.push(make_pair(y, x)); while(!bfs.empty()) { pair<int, int> curr = bfs.front(); bfs.pop(); for(int i = 0; i < 4; i++) { int ny = curr.first + dy[i]; int nx = curr.second + dx[i]; if(0 <= ny && ny < r && 0 <= nx && nx < c) if(vis[ny][nx] != thing) if(arr[curr.first][curr.second] >= arr[ny][nx]) { bfs.push(make_pair(y, x)); mnX = min(maxLeft[ny][nx], mnX); mxX = max(maxRight[ny][nx], mxX); mnY = min(maxUp[ny][nx], mnY); mxY = max(maxDown[ny][nx], mxY); mnX2 = min(mnX2, nx); mxX2 = max(mxX2, nx); mnY2 = min(mnY2, ny); mxY2 = max(mxY2, ny); vis[ny][nx] = thing; sz++; } } } // cout << x << ' ' << y << '\n'; // cout << sz << '\n'; // cout << mnX2 << ' ' << mxX2 << '\n'; // cout << mnY2 << ' ' << mxY2 << '\n'; // cout << mnX << ' ' << mxX << '\n'; // cout << mnY << ' ' << mxY << '\n'; if(sz == (mxX2 - mnX2 + 1) * (mxY2 - mnY2 + 1)) if(mnX + 1 == mnX2) if(mxX - 1 == mxX2) if(mnY + 1 == mnY2) if(mxY - 1 == mxY2) if(0 != mnY2 && mnY2 != r-1 && 0 != mnX2 && mnX2 != c-1) { // cout << "added\n"; ans++; } // cout << '\n'; thing++; } } return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...