Submission #1311554

#TimeUsernameProblemLanguageResultExecution timeMemory
1311554NipphitchSailing Race (CEOI12_race)C++20
100 / 100
841 ms6628 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair <int,int> 
const int N=505;
const int INF=1e9+7;

int dp1[N][N][2],dp2[N][N][2],dp3[N][N][2],nxt[N][2];
bool adj[N][N];

void dp(int l,int r,int x){
    if(adj[l][r]){
        dp1[l][r][x]=1;
        dp2[l][r][x]=1+dp3[r][nxt[l][x]][x^1];
    }
    else dp1[l][r][x]=dp2[l][r][x]=-INF;
    for(int k=nxt[l][x];k!=r;k=nxt[k][x]){
        dp1[l][r][x]=max(dp1[l][r][x],dp1[l][k][x]+dp1[k][r][x]);
        dp2[l][r][x]=max(dp2[l][r][x],dp1[l][k][x]+dp2[k][r][x]);
    }
    dp3[l][r][x]=max(dp2[l][r][x],dp3[l][nxt[r][x^1]][x]);
}

void solve(){
    int n;
    bool type;
    cin >> n >> type;
    for(int i=0;i<n;i++){
        int x;
        while(cin >> x && x--){
            adj[i][x]=true;
        }
        nxt[i][0]=(i+1)%n;
        nxt[i][1]=(i-1+n)%n;
    }
    for(int d=1;d<n;d++){
        for(int l=0,r=(l+d)%n;l<n;l++,r=nxt[r][0]){
            dp(l,r,0);
            dp(r,l,1);
        }
    }
    pii ans;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<2;k++){
                ans=max({{dp2[i][j][k],i},ans});
            }
        }
    }
    if(type){
        for(int l=0;l<n;l++){
            for(int r=0;r<n;r++){
                for(int x=0;x<2;x++){
                    if(dp1[l][r][x]<=0) continue;
                    int st=nxt[r][x];
                    while(st!=l && !adj[st][l]) st=nxt[st][x];
                    if(st==l) continue;
                    for(int ed=nxt[st][x];ed!=l;ed=nxt[ed][x]){
                        if(adj[r][ed]){
                            int num=max(dp3[ed][nxt[st][x]][x^1],dp3[ed][nxt[l][x^1]][x]);
                            ans=max(ans,{2+dp1[l][r][x]+num,st});
                        }
                    }
                }
            }
        }
    }
    cout << ans.first << "\n" << ans.second+1;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...