Submission #140261

# Submission time Handle Problem Language Result Execution time Memory
140261 2019-08-02T11:41:11 Z egorlifar Sailing Race (CEOI12_race) C++17
50 / 100
1624 ms 4684 KB
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
 */
#include <iostream>
#include <complex>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <numeric>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <cmath>
#include <bitset>
#include <cassert>
#include <queue>
#include <stack>
#include <deque>
#include <random>
 
using namespace std;
template<typename T1, typename T2>inline void chkmin(T1 &x, T2 y) { x = (x > y ? y: x);}
template<typename T1, typename T2>inline void chkmax(T1 &x, T2 y) { x = (x < y ? y: x);}
#define sz(c) (int)(c).size()
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define left left224
#define right right224
#define next next224
#define rank rank224
#define prev prev224
#define y1 y1224
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define files(FILENAME) read(FILENAME), write(FILENAME)
#define pb push_back
#define mp make_pair
const string FILENAME = "input";
const int MAXN = 501;

int n, t;
bitset<501> b[MAXN];
int dp[MAXN][MAXN][2];
int dp1[MAXN][MAXN][2];


int dist(const int &i, const int &j) {
    return (j >= i ? j - i: n - i + j);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //read(FILENAME); 
    cin >> n >> t;
    for (int i = 0; i < n; i++) {
        int a;
        while (cin >> a) {
            if (a == 0) {
                break;
            }
            b[i][a - 1] = true;
        }
    }
    for (int len = 1; len <= n - 1; len++) {
        for (int i = 0; i < n; i++) {
            int j = (i + len) % n;
            for (int t = 0; t < 2; t++) {
                int cur = (t == 0 ? i: j);
                for (int k = 0; k <= len; k++) {
                    int g = (i + k >= n ? i + k - n: i + k);
                    if (g != cur) {
                        if (b[cur][g]) {
                            chkmax(dp[len][i][t], dp[k - (cur == i ? 1: 0)][(i == cur ? (i + 1) % n: i)][1] + 1);
                            chkmax(dp[len][i][t], dp[(len - k) - (cur == j ? 1: 0)][g][0] + 1);
                        }
                    }
                }
            }
        }
    }
    if (t == 0) {
        int res = 0;
        int pos = -1;
        for (int i =  0; i < n; i++) {
            chkmax(res, dp[n - 1][i][0]);
            if (res == dp[n - 1][i][0]) {
                pos = i;
            }
            chkmax(res, dp[n - 1][i][1]);
            if (res == dp[n - 1][i][1]) {
                pos = (i + n - 1) % n;
            }
        }
        cout << res << endl;
        cout << pos + 1 << endl;
        return 0;
    }
    for (int len = 1; len <= n - 1; len++) {
        for (int i = 0; i < n; i++) {
            int j = (i + len) % n;
            for (int t = 0; t < 2; t++) {
                int cur = (t == 0 ? i: j);
                for (int k = 0; k <= len; k++) {
                    int g = (i + k >= n ? i + k - n: i + k);
                    if (g != cur) {
                        if (b[cur][g]) {
                            if (cur == j) {
                               chkmax(dp1[len][i][t], dp1[k - (cur == i ? 1: 0)][(i == cur ? (i + 1) % n: i)][1] + 1);
                            } else {
                                chkmax(dp1[len][i][t], dp1[(len - k) - (cur == j ? 1: 0)][g][0] + 1);
                            }
                        }
                    }
                }
            }
        }
    }
    int res = 0;
    int pos = -1;
    for (int i =  0; i < n; i++) {
        chkmax(res, dp[n - 1][i][0]);
        if (res == dp[n - 1][i][0]) {
            pos = i;
        }
        chkmax(res, dp[n - 1][i][1]);
        if (res == dp[n - 1][i][1]) {
            pos = (i + n - 1) % n;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (j == i || !b[i][j]) {
                continue;
            }
            int f = dist(j, i) - 1;
            int len = dp1[f][j][0] + 2;
            if (len == 2) {
                continue;
            }
            for (int k = f + 2; k <= n - 1; k++) {
                int t = (j + k) % n;
                int len1 = len + max(dp[dist(t, j) - 1][t][0], dp[dist(i, t) - 1][(i + 1) % n][1]);
                if (len1 > res) {
                    res = len1;
                    pos = i;
                }
            }
        }
        for (int j = 0; j < n; j++) {
            if (j == i || !b[i][j]) {
                continue;
            }
            int f = dist(i, j) - 1;
            int len = dp1[f][(i + 1) % n][1] + 2;
            if (len == 2) {
                continue;
            }
            for (int k = f + 2; k <= n - 1; k++) {
                int t = (i + k) % n;
                int len1 = len + max(dp[dist(t, i) - 1][t][0], dp[dist(j, t) - 1][(j + 1) % n][1]);
                if (len1 > res) {
                    res = len1;
                    pos = i;
                }
            }
        }
    }
    cout << res << endl;
    cout << pos + 1 << endl;
    return 0; 
}


# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Incorrect 3 ms 504 KB Output isn't correct
4 Incorrect 3 ms 636 KB Output isn't correct
5 Correct 6 ms 504 KB Output is correct
6 Correct 6 ms 760 KB Output is correct
7 Correct 6 ms 632 KB Output is correct
8 Incorrect 8 ms 988 KB Output isn't correct
9 Correct 9 ms 760 KB Output is correct
10 Correct 10 ms 776 KB Output is correct
11 Correct 12 ms 760 KB Output is correct
12 Incorrect 95 ms 1884 KB Output isn't correct
13 Incorrect 241 ms 2776 KB Output isn't correct
14 Correct 237 ms 2032 KB Output is correct
15 Incorrect 1300 ms 4628 KB Output isn't correct
16 Incorrect 1466 ms 4676 KB Output isn't correct
17 Incorrect 1257 ms 4472 KB Output isn't correct
18 Correct 470 ms 2492 KB Output is correct
19 Incorrect 1624 ms 4552 KB Output isn't correct
20 Incorrect 1595 ms 4684 KB Output isn't correct