제출 #1261329

#제출 시각아이디문제언어결과실행 시간메모리
1261329biank축구 경기장 (IOI23_soccer)C++20
100 / 100
4403 ms256288 KiB
#include "soccer.h" #include <bits/stdc++.h> #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define pb push_back #define eb emplace_back #define fst first #define snd second using namespace std; using vi = vector<int>; using ii = pair<int, int>; using ll = long long; const int MAX_N = 2005; int pref[MAX_N][MAX_N], n; vector<ii> ran[MAX_N]; int query(int i1, int i2, int j1, int j2) { i2++, j2++; return pref[i2][j2] - pref[i1][j2] - pref[i2][j1] + pref[i1][j1]; } ii getMaximal(int i, int l, int r) { int lo = i, hi = n; while (hi - lo > 1) { int mid = (lo + hi) / 2; if (query(i, mid, l, r) == 0) lo = mid; else hi = mid; } int i2 = lo; lo = -1, hi = i; while (hi - lo > 1) { int mid = (lo + hi) / 2; if (query(mid, i, l, r) == 0) hi = mid; else lo = mid; } int i1 = hi; return ii{i1, i2}; } struct Rectangle { int i1, i2, j1, j2; ll val; Rectangle(int i, int _j1, int _j2) { j1 = _j1, j2 = _j2; tie(i1, i2) = getMaximal(i, j1, j2); val = 1LL * MAX_N * MAX_N * i + MAX_N * j1 + j2; } bool operator<(const Rectangle &o) const { return val < o.val; } }; map<Rectangle, int> memo; void aux(int i, const Rectangle &curr, vector<Rectangle> &v) { int lo = -1, hi = sz(ran[i]); while (hi - lo > 1) { int mid = (lo + hi) / 2; if (ran[i][mid].snd >= curr.j1) hi = mid; else lo = mid; } int j = hi; int &ret = memo[curr]; while (j < sz(ran[i]) && ran[i][j].fst <= curr.j2) { v.eb(i, max(ran[i][j].fst, curr.j1), min(ran[i][j].snd, curr.j2)); j++; } } int dp(const Rectangle &r) { if (!memo.count(r)) { vector<Rectangle> v; if (r.i1 > 0) aux(r.i1 - 1, r, v); if (r.i2 + 1 < n) aux(r.i2 + 1, r, v); for (auto nxt : v) memo[r] = max(memo[r], dp(nxt) + (nxt.j2 - nxt.j1 + 1) * ((nxt.i2 - nxt.i1 + 1) - (r.i2 - r.i1 + 1))); } return memo[r]; } int biggest_stadium(int N, vector<vi> F) { n = N; forn(i, n) forn(j, n) pref[i + 1][j + 1] = pref[i][j + 1] + pref[i + 1][j] - pref[i][j] + F[i][j]; forn(i, n) { forn(j, n) { if (F[i][j]) continue; if (j == 0 || F[i][j - 1]) { ran[i].eb(j, j); } else { ran[i].back().snd++; } } } int ret = 0; forn(i, n) for (auto [j1, j2] : ran[i]) { Rectangle r(i, j1, j2); ret = max(ret, dp(r) + (r.j2 - r.j1 + 1) * (r.i2 - r.i1 + 1)); } return ret; }
#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...