Submission #832289

# Submission time Handle Problem Language Result Execution time Memory
832289 2023-08-21T08:28:52 Z TS_2392 Sailing Race (CEOI12_race) C++14
20 / 100
1024 ms 5300 KB
#include <bits/stdc++.h>
using namespace std;

#define fileIO(name) if(fopen(name".inp", "r")) {freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);}
#define SPEED {ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);}
template<class T1, class T2> bool minimize(T1 &a, T2 b){return a > b ? a = b, true : false;}
template<class T1, class T2> bool maximize(T1 &a, T2 b){return a < b ? a = b, true : false;}

const int N = 503;
int n, type, res, res_vtx, nxt[N], prv[N];
int adj[N][N], dp1[N][N][2], dp2[N][N][2];
int main(){
    cin >> n >> type;
    for(int u = 1, v; u <= n; ++u){
        while(cin >> v){
            if(v == 0) break;
            else adj[u][v] = 1;
        }
        nxt[u] = u + 1; prv[u] = u - 1;
    }
    nxt[n] = 1; prv[1] = n;
    for(int len = 2; len < n; ++len){
        for(int i = 1; i <= n; ++i){
            int j = i + len - 1;
            if(j > n) j -= n;

            if(adj[i][j]) dp1[i][j][0] = 1;
            for(int k = nxt[i]; k != j; k = nxt[k]) if(adj[k][j] && dp1[i][k][0]){
                maximize(dp1[i][j][0], dp1[i][k][0] + 1);
            }

            if(adj[j][i]) dp1[i][j][1] = 1;
            for(int k = prv[j]; k != i; k = prv[k]) if(adj[k][i] && dp1[k][j][1]){
                maximize(dp1[i][j][1], dp1[k][j][1] + 1);
            }

        }
    }
    for(int len = 2; len < n; ++len){
        for(int i = 1; i <= n; ++i){
            int j = i + len - 1;
            if(j > n) j -= n;

            dp2[i][j][0] = dp2[i][prv[j]][0];
            if(adj[i][j]) maximize(dp2[i][j][0], dp2[nxt[i]][j][1] + 1);
            for(int k = nxt[i]; k != j; k = nxt[k]) if(adj[k][j] && dp1[i][k][0]){
                maximize(dp2[i][j][0], dp1[i][k][0] + 1 + dp2[nxt[k]][j][1]);
            }

            dp2[i][j][1] = dp2[nxt[i]][j][1];
            if(adj[j][i]) maximize(dp2[i][j][1], dp2[i][prv[j]][0] + 1);
            for(int k = prv[j]; k != i; k = prv[k]) if(adj[k][i] && dp1[k][j][1]){
                maximize(dp2[i][j][1], dp1[k][j][1] + 1 + dp2[i][prv[k]][0]);
            }

            if(maximize(res, dp2[i][j][0])) res_vtx = i;
            if(maximize(res, dp2[i][j][1])) res_vtx = j;
        }
    }
    cout << res << '\n' << res_vtx;
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Incorrect 0 ms 468 KB Output isn't correct
3 Incorrect 1 ms 596 KB Output isn't correct
4 Incorrect 1 ms 596 KB Output isn't correct
5 Correct 2 ms 724 KB Output is correct
6 Incorrect 3 ms 852 KB Output isn't correct
7 Incorrect 5 ms 1004 KB Output isn't correct
8 Incorrect 4 ms 1108 KB Output isn't correct
9 Incorrect 9 ms 1112 KB Output isn't correct
10 Incorrect 6 ms 1300 KB Output isn't correct
11 Incorrect 14 ms 1292 KB Output isn't correct
12 Incorrect 61 ms 2264 KB Output isn't correct
13 Incorrect 167 ms 3252 KB Output isn't correct
14 Correct 359 ms 4196 KB Output is correct
15 Incorrect 839 ms 5224 KB Output isn't correct
16 Incorrect 926 ms 5224 KB Output isn't correct
17 Incorrect 859 ms 5220 KB Output isn't correct
18 Correct 639 ms 5300 KB Output is correct
19 Incorrect 1024 ms 5216 KB Output isn't correct
20 Incorrect 1022 ms 5220 KB Output isn't correct