Submission #143352

#TimeUsernameProblemLanguageResultExecution timeMemory
143352KCSCVrtić (COCI18_vrtic)C++14
160 / 160
1875 ms37628 KiB
#include <bits/stdc++.h> using namespace std; const int DIM = 155; const int MAX = 10000005; const int INF = 1000000005; bool oki[DIM]; int cst[DIM][DIM], dp[MAX], val[DIM]; int ans[DIM], nxt[DIM], fth[MAX]; vector<int> mat[DIM][DIM]; vector<vector<int>> cyc[DIM]; vector<int> decrypt(int v, int n) { vector<int> dec(n, 0); for (int i = 1; i <= n; ++i) for (; v >= val[i]; v -= val[i]) ++dec[i - 1]; return dec; } int main(void) { #ifdef HOME freopen("vrtic.in", "r", stdin); freopen("vrtic.out", "w", stdout); #endif int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> nxt[i]; for (int i = 1; i <= n; ++i) cin >> val[i]; for (int i = 1; i <= n; ++i) { if (oki[i]) continue; vector<int> axc; for (int j = i; !oki[j]; j = nxt[j]) { axc.push_back(j); oki[j] = true; } cyc[axc.size()].push_back(axc); } sort(val + 1, val + n + 1); for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; ++j) { for (int k = i; k <= j; k += 2) mat[i][j].push_back(val[k]); for (int k = j - (j - i + 1) % 2; k >= i; k -= 2) mat[i][j].push_back(val[k]); cst[i][j] = abs(mat[i][j].front() - mat[i][j].back()); for (int k = 1; k <= j - i; ++k) cst[i][j] = max(cst[i][j], abs(mat[i][j][k] - mat[i][j][k - 1])); } } val[n] = 1; for (int i = n; i >= 1; --i) val[i - 1] = val[i] * (cyc[i].size() + 1); vector<int> lst; for (int i = 1; i <= n; ++i) if (cyc[i].empty()) val[i] = INF; else lst.push_back(i); for (int msk = 1; msk < val[0]; ++msk) dp[msk] = INF; for (int msk = 0; msk < val[0]; ++msk) { vector<int> dec = decrypt(msk, n); int st = 0; for (int i : lst) st += dec[i - 1] * i; for (int i : lst) { if (dec[i - 1] < cyc[i].size()) { if (dp[msk + val[i]] > max(dp[msk], cst[st + 1][st + i])) { dp[msk + val[i]] = max(dp[msk], cst[st + 1][st + i]); fth[msk + val[i]] = i; } } } } vector<int> dec(n, 0); for (int i = 1; i <= n; ++i) dec[i - 1] = cyc[i].size(); for (int msk = val[0] - 1, en = n; msk; msk -= val[fth[msk]]) { int ln = fth[msk]; --dec[ln - 1]; en -= ln; for (int i = 0; i < ln; ++i) ans[cyc[ln][dec[ln - 1]][i]] = mat[en + 1][en + ln][i]; } cout << dp[val[0] - 1] << endl; for (int i = 1; i <= n; ++i) cout << ans[i] << " "; return 0; }

Compilation message (stderr)

vrtic.cpp: In function 'int main()':
vrtic.cpp:73:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (dec[i - 1] < cyc[i].size()) {
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...