Submission #66871

# Submission time Handle Problem Language Result Execution time Memory
66871 2018-08-12T16:56:00 Z Benq Sailing Race (CEOI12_race) C++11
40 / 100
3000 ms 9712 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
 
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
 
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
 
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
 
#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
 
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
 
const int MOD = 1000000007;
const ll INF = 1e18;
 
bool ok[501][501];
int N,k;
 
int nor(int x) { x = (x%N+N)%N; if (x == 0) x += N; return x; }
template<class T> void MX(T& a, T b) { a = max(a,b); }

int alt[2][501][501];

pi solve0() {
    FOR(len,2,N) FOR(i,1,N+1) {
        int en = nor(i+len);
        FOR(j,1,len) {
            int m = nor(i+j);
            int ex = max(alt[0][m][en],alt[1][i][m])+1;
            if (ok[i][m]) MX(alt[0][i][en],ex);
            if (ok[en][m]) MX(alt[1][i][en],ex);
        }
    }
    
    pi ret = {0,0};
    FOR(i,1,N+1) FOR(j,1,N+1) if (ok[i][j]) 
        MX(ret,{max(alt[1][i][j],alt[0][j][i])+1,i});
    return ret;
}

int no[2][501][501];
pi yes[2][501][501];

pi solve1() {
    pi ret = {0,0};
    F0R(i,2) FOR(j,1,N+1) FOR(k,1,N+1) {
        if (j != k) no[i][j][k] = -MOD;
        else no[i][j][k] = 0;
        yes[i][j][k] = {-MOD,-MOD};
    }
    FOR(len,1,N) FOR(i,1,N+1) {
        int en = nor(i+len);
        int existsEdge = 0;
        for (int j = len-1; j >= 0; --j) {
            int m = nor(i+j);
            if (ok[m][en]) {
                MX(no[0][i][en],no[0][i][m]+1);
                if (existsEdge) MX(yes[0][i][en],{no[0][i][en]+1,existsEdge});
            }
            if (ok[m][i]) existsEdge = m;
        }
        MX(ret,{yes[0][i][en].f+alt[0][en][i]+1,yes[0][i][en].s});
        
        no[0][i][en] = -MOD;
        for (int j = 0; j < len; ++j) {
            int m = nor(i+j);
            if (j) MX(ret,{no[0][i][en]+alt[1][m][en]+1,m});
            if (ok[m][en]) MX(no[0][i][en],no[0][i][m]+1);
        }
        
        int st = nor(i-len);
        existsEdge = 0;
        for (int j = len-1; j >= 0; --j) {
            int m = nor(i-j);
            if (ok[m][st]) {
                MX(no[1][st][i],no[1][m][i]+1);
                if (existsEdge) MX(yes[1][st][i],{no[1][st][i]+1,existsEdge});
            }
            if (ok[m][i]) existsEdge = m;
        }
        MX(ret,{yes[1][st][i].f+alt[1][i][st]+1,yes[1][st][i].s});
        
        no[1][st][i] = -MOD;
        for (int j = 0; j < len; ++j) {
            int m = nor(i-j);
            if (j) MX(ret,{no[1][st][i]+alt[0][st][m]+1,m});
            if (ok[m][st]) MX(no[1][st][i],no[1][m][i]+1);
        }
    }
    
    return ret;
}
 
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> N >> k;
    FOR(i,1,N+1) {
        int x; 
        while (cin >> x) {
            if (x == 0) break;
            ok[i][x] = 1;
        }
    }
    pi t = solve0();
    if (k == 1) MX(t,solve1());
    cout << t.f << "\n" << t.s;
}
 
/* Look for:
* the exact constraints (multiple sets are too slow for n=10^6 :( ) 
* special cases (n=1?)
* overflow (ll vs int?)
* array bounds
*/
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 4 ms 744 KB Output isn't correct
3 Incorrect 4 ms 952 KB Output isn't correct
4 Incorrect 6 ms 1112 KB Output isn't correct
5 Correct 5 ms 1112 KB Output is correct
6 Incorrect 14 ms 1552 KB Output isn't correct
7 Correct 8 ms 1552 KB Output is correct
8 Incorrect 25 ms 1928 KB Output isn't correct
9 Correct 15 ms 1928 KB Output is correct
10 Correct 11 ms 1928 KB Output is correct
11 Correct 20 ms 1928 KB Output is correct
12 Incorrect 353 ms 4032 KB Output isn't correct
13 Incorrect 1132 ms 5652 KB Output isn't correct
14 Correct 598 ms 5652 KB Output is correct
15 Execution timed out 3037 ms 9048 KB Time limit exceeded
16 Execution timed out 3053 ms 9256 KB Time limit exceeded
17 Execution timed out 3052 ms 9380 KB Time limit exceeded
18 Correct 1293 ms 9380 KB Output is correct
19 Execution timed out 3020 ms 9548 KB Time limit exceeded
20 Execution timed out 3041 ms 9712 KB Time limit exceeded