Submission #1277202

#TimeUsernameProblemLanguageResultExecution timeMemory
1277202dostsNetrpeljivost (COI23_netrpeljivost)C++20
59 / 100
1594 ms66092 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define sp << " " << #define all(x) x.begin(),x.end() #define big(x) ((int)(x.size())) using namespace std; const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18; const int N = (1LL<<11); void solve() { int n; cin >> n; int f[n][n]; int cost[n][n]; for (int i = 0;i<n;i++) { for (int j = 0;j<n;j++) { cin >> cost[i][j]; } } for (int i = 0;i<n;i++) { for (int j = 0;j<n;j++) f[i][j]= inf; } int lgs[n+1]; lgs[1] = 0; for (int i=2;i<=n;i++) lgs[i] = lgs[i>>1]+1; for (int le = n-1;le>=0;le--) { for (int ri = le;ri < n;ri++) { int len = ri-le+1; if ((1<<lgs[len]) != len) continue; if (le%len != 0) continue; if (len == n) continue; if (len == 1) { f[le][ri] = 0; continue; } if (len == 2) { f[le][le+1] = f[le+1][le] = cost[le][le+1]; continue; } int mid = (le+ri) >> 1; for (int r = ri;r >= mid+1;r--) { for (int a = le;a <= mid;a++) { int mn = inf; for (int b = mid+1;b<=ri;b++) { int chunk = (1<<lgs[b^r]+1); if (chunk <= len/4 || b == r) { continue; } mn = min(mn,cost[a][b]+f[b][r]); } for (int l = le;l<=mid;l++) { int chunk = (1<<lgs[a^l]+1); if (chunk <= len/4 || a == l) { continue; } f[l][r] = min(f[l][r],f[l][a]+mn); } } } for (int l = le;l<=mid;l++) { for (int r = mid+1;r<=ri;r++) { f[r][l] = f[l][r]; } } } } int mn = inf; vi mns(n+1),mns2(n+1); for (int i = 0;i<n/2;i++) { int mn1 = inf; for (int j = 0;j<n/2;j++) { int chunk = (1<<lgs[i^j]+1); if (chunk <= n/4 || i == j) { continue; } mn1 = min(mn1,f[j][i]); } mns[i] = mn1; } for (int i = n/2;i<n;i++) { int mn2 = inf; for (int j = n/2;j<n;j++) { int chunk = (1<<lgs[i^j]+1); if (chunk <= n/4 || i == j) { continue; } mn2 = min(mn2,f[i][j]); } mns2[i] = mn2; } for (int i = 0;i<n/2;i++) { for (int j = n/2;j<n;j++) { mn = min(mn,mns[i]+mns2[j]+cost[i][j]); } } cout << mn << '\n'; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef Dodi freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...