Submission #1229717

#TimeUsernameProblemLanguageResultExecution timeMemory
1229717vladiliusSoccer Stadium (IOI23_soccer)C++20
1.50 / 100
245 ms63260 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second int biggest_stadium(int n, vector<vector<int>> FF){ vector<vector<int>> F(n + 1, vector<int>(n + 1)), P(n + 1, vector<int>(n + 1)); for (int i = 1; i <= n; i++){ for (int j = 1; j <= n; j++){ F[i][j] = FF[i - 1][j - 1]; P[i][j] = P[i][j - 1] + !F[i][j]; } } int M = 1e9, K = 0, C = 0; for (int i = 1; i <= n; i++){ if (P[i][n]){ M = min(M, i); K = max(K, i); C++; } } if (C == (K - M + 1)){ vector<pii> all; bool TT = 1; int L = 0, R = 0, I = 0; for (int i = M; i <= K; i++){ int mn = 1e9, mx = 0; for (int j = 1; j <= n; j++){ if (!F[i][j]){ mn = min(mn, j); mx = max(mx, j); } } if (P[i][n] != (mx - mn + 1)){ TT = 0; break; } all.pb({mn, mx}); if (i == M){ L = mn; R = mx; } else { if (!I){ if (mn <= L && R <= mx){ L = mn; R = mx; } else { if (L <= mn && mx <= R){ I = 1; L = mn; R = mx; } else { TT = 0; break; } } } else { if (L <= mn && mx <= R){ L = mn; R = mx; } else { TT = 0; break; } } } } if (TT){ auto cmp = [&](pii x, pii y){ if (x.ff != y.ff) return x.ff < y.ff; return x.ss > y.ss; }; sort(all.begin(), all.end(), cmp); for (int i = 0; i + 1 < all.size(); i++){ if (all[i].ss < all[i + 1].ss){ return 0; } } int out = 0; for (int i = 1; i <= n; i++) out += P[i][n]; return out; } } if (n > 7) return 0; int tot = 0, out = 0; vector<pii> all; function<void(int, int, int, bool)> gen = [&](int i, int l, int r, bool I){ out = max(out, tot); // cout<<"! "<<i<<" "<<l<<" "<<r<<" "<<tot<<" "<<I<<"\n"; if (i == n) return; if (!I){ for (int l1 = 1; l1 <= l; l1++){ for (int r1 = max(l1, r); r1 <= n; r1++){ if (P[i + 1][r1] == P[i + 1][l1 - 1]){ bool H = 0; for (auto [L, R]: all){ if (L == l1 || R == r1) continue; bool I1 = (l1 < L), I2 = (r1 < R); if (I1 == I2){ H = 1; } } if (H) continue; all.pb({l1, r1}); tot += (r1 - l1 + 1); gen(i + 1, l1, r1, 0); tot -= (r1 - l1 + 1); all.pop_back(); } } } for (int l1 = l; l1 <= r; l1++){ for (int r1 = l1; r1 <= r; r1++){ if (P[i + 1][r1] == P[i + 1][l1 - 1]){ bool H = 0; for (auto [L, R]: all){ if (L == l1 || R == r1) continue; bool I1 = (l1 < L), I2 = (r1 < R); if (I1 == I2){ H = 1; } } if (H) continue; all.pb({l1, r1}); tot += (r1 - l1 + 1); gen(i + 1, l1, r1, 1); tot -= (r1 - l1 + 1); all.pop_back(); } } } } else { for (int l1 = l; l1 <= r; l1++){ for (int r1 = l1; r1 <= r; r1++){ if (P[i + 1][r1] == P[i + 1][l1 - 1]){ bool H = 0; for (auto [L, R]: all){ if (L == l1 || R == r1) continue; bool I1 = (l1 < L), I2 = (r1 < R); if (I1 == I2){ H = 1; } } if (H) continue; all.pb({l1, r1}); tot += (r1 - l1 + 1); gen(i + 1, l1, r1, 1); tot -= (r1 - l1 + 1); all.pop_back(); } } } } }; for (int i = 0; i < n; i++){ tot = 0; gen(i, n, 1, 0); } return out; }
#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...