제출 #1277207

#제출 시각아이디문제언어결과실행 시간메모리
1277207dostsNetrpeljivost (COI23_netrpeljivost)C++20
10 / 100
4 ms1348 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; vi appropriate[__lg(n)][n]; for (int i=2;i<__lg(n);i++) { int len = (1<<i); for (int j = 0;j<n;j++) { for (int oth = 0;oth < n;oth++) { int chunk = (1<<lgs[j^oth]+1); if (chunk <= len/4 || j == oth) { continue; } appropriate[i][j].push_back(oth); } } } for (int le = n-1;le>=0;le--) { for (int ri = le;ri < n;ri++) { int len = ri-le+1; int ln = __lg(len); 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 : appropriate[ln][r]) { mn = min(mn,cost[a][b]+f[b][r]); } for (int l : appropriate[ln][a]) { 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...