Submission #1014391

#TimeUsernameProblemLanguageResultExecution timeMemory
1014391amine_arouaNetrpeljivost (COI23_netrpeljivost)C++17
100 / 100
1224 ms123988 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#define intt long long
#define pb push_back
vector<vector<int>> mat;
int n ;
const intt INF = 1e18;
vector<vector<intt>> dp , dp_;
void solve(int l , int r)
{
    if(l + 1 == r)
    {
        dp[l][r] = dp[r][l] = mat[l][r];
        return ;
    }
    int m = (l + r)/2;
    solve(l , m);
    solve(m + 1,  r);
    for(int i = l ; i <= m ; i++)
    {
        for(int j1 = m + 1 ; j1 <= (m + 1 + r)/2 ; j1++)
        {
            for(int j2 = (m + 1 + r)/2  + 1; j2 <= r ; j2++)
            {
                dp_[i][j1] = min(dp_[i][j1] , dp[j1][j2] + mat[j2][i]);
                dp_[i][j2] = min(dp_[i][j2] , dp[j1][j2] + mat[j1][i]);
            }
        }
    }
    for(int i1 = l ; i1 <= (l + m)/2 ; i1++)
    {
        for(int i2 = (l + m)/2 + 1 ; i2 <= m ; i2++)
        {
            for(int j = m + 1 ; j <= r ; j++)
            {
                dp[i1][j] = min(dp[i1][j] , dp_[i2][j] + dp[i1][i2]);
                dp[i2][j] = min(dp[i2][j] , dp_[i1][j] + dp[i1][i2]);
            }
        }
    }
    for(int i = l ; i <=  m ; i++)
    {
        for(int j = m + 1 ; j <= r ; j++)
        {
            dp[j][i] = dp[i][j];
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    mat = vector<vector<int>> (n , vector<int>(n));
    dp.assign(n , vector<intt>(n , INF));
    dp_ = dp;
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < n ; j++)
        {
            cin>>mat[i][j];
        }
    }
    if(n == 1)
    {
        cout<<0<<'\n';
        return 0;
    }
    intt ans = INF;
    solve(0 ,n - 1);
    int l = 0 , r = n - 1;
    int m = (l  + r)/2;
    for(int fr = l ; fr <= m ; fr++)
    {
        for(int bk = m + 1 ; bk <= r ; bk++)
        {
            ans = min({ans , dp[fr][bk] , dp[bk][fr]});
        }
    }
    cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...