제출 #845954

#제출 시각아이디문제언어결과실행 시간메모리
845954vjudge1축구 경기장 (IOI23_soccer)C++17
25 / 100
243 ms31852 KiB
#include "soccer.h" #include <bits/stdc++.h> // 123 int biggest_stadium(int N, std::vector<std::vector<int>> F) { std::vector<std::pair<int, int>> segs(N, {-1, -1}); int sum = 0; int k = -1, best = -1; for (int i = 0; i < N; i++) { int cnt = 0; int l = N, r = -1; for (int j = 0; j < N; j++) { if (F[i][j] == 0) { cnt++; l = std::min(l, j); r = std::max(r, j); } } if (cnt) { if (r - l + 1 != cnt) return 0; segs[i] = {l, r}; sum += cnt; if (r - l > best) { best = r - l; k = i; } } } int l = k, r = k; int ll = segs[k].first, rr = segs[k].second; int cur = rr - ll + 1; while (true) { if (l == 0 || segs[l - 1].first == -1) { if (r == N - 1) break; if (segs[r + 1].first == -1) break; auto [nl, nr] = segs[r + 1]; if (nl < ll || nr > rr) return 0; ll = nl, rr = nr; cur += nr - nl + 1; r++; } else if (r == N - 1 || segs[r + 1].first == -1) { if (segs[l - 1].first == -1) break; auto [nl, nr] = segs[l - 1]; if (nl < ll || nr > rr) return 0; ll = nl, rr = nr; cur += nr - nl + 1; l--; } else { auto [ul, ur] = segs[l - 1]; auto [dl, dr] = segs[r + 1]; if (ur - ul > dr - dl) { l--; if (ul < ll || ur > rr) return 0; ll = ul, rr = ur; cur += ur - ul + 1; } else { r++; if (dl < ll || dr > rr) return 0; ll = dl, rr = dr; cur += dr - dl + 1; } } } return cur == sum ? sum : 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...