Spinning Table

#include <bits/stdc++.h>
#define N 300000

using namespace std;

int n;
int pi[3];
int cn[3][100+5];
int dp[100+5][100+5][100+5][3];
int res;

void input(){
    //freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=0;i<3;i++){
        cin>>pi[i];
        for(int j=1;j<=pi[i];j++){
            cin>>cn[i][j];
            cn[i][j]--;
        }
        cn[1][0]=n/3;
        cn[2][0]=2*(n/3);
    }
    memset(dp,-1,sizeof dp);
}

int rev(int a,int b){
    int diff=abs(a-b);
    diff%=n;
    return min(diff,n-diff);
}

int pro(int i,int j,int k,int idx){
    //cout<<i<<" "<<j<<" "<<k<<" "<<idx<<endl;
    int &ans=dp[i][j][k][idx];
    if(ans!=-1){
        return ans;
    }
    if(i>pi[0]+1||j>pi[1]+1||k>pi[2]+1){
        //cout<<" "<<i<<" "<<j<<" "<<k<<" "<<idx<<endl;
        return ans=1e9;
    }
    if(i==pi[0]+1&&j==pi[1]+1&&k==pi[2]+1){
        return ans=0;
    }
    int p;
    if(idx==0){
        p=cn[0][i-1];
    }else if(idx==1){
        p=cn[1][j-1]+2*(n/3);
    }else{
        p=cn[2][k-1]+n/3;
    }
    ans=1e9+5;
    ans=min(ans,pro(i+1,j,k,0)+rev(p,cn[0][i]));
    ans=min(ans,pro(i,j+1,k,1)+rev(p,cn[1][j]+2*(n/3)));
    ans=min(ans,pro(i,j,k+1,2)+rev(p,cn[2][k]+n/3));
    return ans;
}

int main() {
    input();
    res=pro(1,1,1,0);
    cout<<res<<endl;
    return 0;
}


 

Comments