이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "soccer.h"
using namespace std;
int biggest_stadium(int N, vector<vector<int>> F){
vector<vector<int>> L(N, vector<int>(N)), R(N, vector<int>(N, N)), H(N, vector<int>(N));
vector<vector<int>> dp(N, vector<int>(N));
int ans = 0;
for(int i = 0; i < N; i++){
if(i > 0) H[i] = H[i-1];
for(int j = 0; j < N; j++){
if(F[i][j]) H[i][j] = 0;
else H[i][j]++;
}
stack<pair<int, int>> s;
s.emplace(-1, -1);
for(int k = 0; k < N; k++){
while(s.top().first > H[i][k]){
R[i][s.top().second] = k;
s.pop();
}
if(s.top().first == H[i][k]) L[i][k] = L[i][s.top().second];
else L[i][k] = s.top().second+1;
s.emplace(H[i][k], k);
}
vector<int> ord(N);
for(int j = 0; j < N; j++) ord[j] = j;
sort(ord.begin(), ord.end(), [&](int a, int b){return H[i][a]<H[i][b];});
for(int j : ord){
if(H[i][j] == 0) continue;
int w = R[i][j]-L[i][j];
dp[i][j] = w*H[i][j];
if(i > 0) dp[i][j] = max(dp[i][j], w+dp[i-1][j]);
if(int k = L[i][j]-1; k >= 0){
dp[i][j] = max(dp[i][j], w*(H[i][j]-H[i][k]) + dp[i][k]);
}
if(int k = R[i][j]; k < N){
dp[i][j] = max(dp[i][j], w*(H[i][j]-H[i][k]) + dp[i][k]);
}
ans = max(ans, dp[i][j]);
}
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |