Submission #1181730

#TimeUsernameProblemLanguageResultExecution timeMemory
1181730jbarejaSandcastle 2 (JOI22_ho_t5)C++20
19 / 100
5094 ms1412 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int H; // liczba wierszy int W; // liczba kolumn vector<vector<int>> height; vector<vector<bool>> visited; vector<pair<int,int>> moves = { {-1,0}, {1,0}, {0,-1}, {0,1} }; ll formula_1_x_W(ll x) { return x * (x-1) / 2; } void subtask_1() { ll ans = W; ll cnt = 1; vector<int> extremes = { 1 }; for (int i=2; i<=W-1; i++) if ((height[1][i-1] < height[1][i] && height[1][i] > height[1][i+1]) || (height[1][i-1] > height[1][i] && height[1][i] < height[1][i+1])) extremes.push_back(i); extremes.push_back(W); for (int i=0; i<extremes.size()-1; i++) ans += formula_1_x_W(extremes[i+1] - extremes[i] + 1); cout << ans << '\n'; } bool in_range(int vi, int vj, int i1, int j1, int i2, int j2) { return i1 <= vi && vi <= i2 && j1 <= vj && vj <= j2; } void dfs(int vi, int vj, int i1, int j1, int i2, int j2) { visited[vi][vj] = true; height[0][0] = INT_MIN; int mi = 0, mj = 0; for (const auto& [di, dj]: moves) if (in_range(vi+di,vj+dj, i1,j1, i2,j2) && !visited[vi+di][vj+dj] && height[vi+di][vj+dj] < height[vi][vj]) { if (height[mi][mj] < height[vi+di][vj+dj]) mi = vi+di, mj = vj+dj; } if (mi == 0 && mj == 0) return; dfs(mi,mj, i1,j1, i2,j2); } void visualize(int i1, int j1, int i2, int j2) { for (int i=1; i<=H; i++) { for (int j=1; j<=W; j++) { if (in_range(i,j, i1,j1, i2,j2)) cout << '#'; else cout << '.'; } cout << '\n'; } cout << '\n'; } bool check(int i1, int j1, int i2, int j2) { int vi = i1; int vj = j1; for (int i=i1; i<=i2; i++) for (int j=j1; j<=j2; j++) { visited[i][j] = false; if (height[i][j] > height[vi][vj]) vi = i, vj = j; } dfs(vi,vj, i1,j1, i2,j2); for (int i=i1; i<=i2; i++) for (int j=j1; j<=j2; j++) if (!visited[i][j]) return false; // visualize(i1, j1, i2, j2); return true; } void subtask_2() { int ans = 0; for (int i1=1; i1<=H; i1++) for (int j1=1; j1<=W; j1++) for (int i2=i1; i2<=H; i2++) for (int j2=j1; j2<=W; j2++) ans += check(i1,j1,i2,j2); cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> H >> W; height.assign(H+2, vector<int>(W+2, 0)); visited.assign(H+2, vector<bool>(W+2, false)); for (int i=1; i<=H; i++) for (int j=1; j<=W; j++) cin >> height[i][j]; if (H == 1) { subtask_1(); return 0; } subtask_2(); }
#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...