# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
552055 | Alexandruabcde | Sailing Race (CEOI12_race) | C++14 | 158 ms | 2652 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
constexpr int NMAX = 502;
int N, K;
vector <int> G[NMAX];
void Read () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> K;
for (int i = 1; i <= N; ++ i ) {
int x;
cin >> x;
while (x != 0) {
G[i].push_back(x);
cin >> x;
}
}
}
bool Between (int val, int st, int dr) {
if (st <= dr)
return (st <= val && val <= dr);
return (st <= val || val <= dr);
}
int Before (int val) {
if (val > 1) return val-1;
return N;
}
int After (int val) {
if (val < N) return val + 1;
return 1;
}
int dp[NMAX][NMAX][2];
void Precompute () {
for (int i = 1; i <= N; ++ i )
for (int j = 1; j <= N; ++ j )
for (int c = 0; c < 2; ++ c )
dp[i][j][c] = 0;
for (int lg = 2; lg <= N; ++ lg ) {
for (int i = 1; i <= N; ++ i ) {
int j = i + lg - 1;
if (j > N) j -= N;
dp[i][j][0] = dp[i][j][1] = 0;
///Caz I: din i
for (auto vec : G[i]) {
if (!Between(vec, i, j)) continue;
dp[i][j][0] = max(dp[i][j][0], 1 + max(dp[After(i)][vec][1], dp[vec][j][0]));
}
///Caz II: din j
for (auto vec : G[j]) {
if (!Between(vec, i, j)) continue;
dp[i][j][1] = max(dp[i][j][1], 1 + max(dp[i][vec][1], dp[vec][Before(j)][0]));
}
}
}
}
void Solve_Case_0 () {
int ans = 0, start = 1;
for (int i = 1; i <= N; ++ i ) {
for (auto vec : G[i]) {
///i -> vec
int posib = 1 + max(dp[After(i)][vec][1], dp[vec][Before(i)][0]);
if (posib > ans) {
ans = posib;
start = i;
}
}
}
cout << ans << '\n' << start << '\n';
}
int main () {
Read();
Precompute();
if (K == 0) Solve_Case_0 ();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |