# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
47375 | Bruteforceman | Vrtić (COCI18_vrtic) | C++11 | 2067 ms | 61844 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
int a[155];
int c[155];
int n;
typedef pair <int, int> pii;
int ans[155][155];
bool vis[155];
vector <int> v[155];
vector <int> cyc[155];
vector <int> sizes;
map <vector <int>, int> DP[155];
const int inf = 1000000000 + 7;
int cost[155];
int dp(int cur, vector <int> occ) {
if(cur == n + 1) return 0;
if(DP[cur].find(occ) != DP[cur].end()) return DP[cur][occ];
int res = inf;
for(size_t i = 0; i < sizes.size(); i++) {
if(occ[i] > 0 && cur + sizes[i] - 1 <= n) {
--occ[i];
res = min(res, max(ans[cur][cur + sizes[i] - 1], dp(cur + sizes[i], occ)));
++occ[i];
}
}
return DP[cur][occ] = res;
}
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
}
sort(c + 1, c + n + 1);
for(int i = 1; i <= n; i++) {
for(int j = i; j <= n; j++) {
ans[i][j] = 0;
for(int k = i; k <= j-2; k++) {
ans[i][j] = max(ans[i][j], c[k + 2] - c[k]);
}
if(i == j-1) {
ans[i][j] = max(ans[i][j], c[j] - c[i]);
}
}
}
int idx = 0;
map <int, int> cnt;
for(int i = 1; i <= n; i++) {
if(vis[i] == true) continue;
int cur = i;
++idx;
while(vis[cur] == false) {
vis[cur] = true;
v[idx].push_back(cur);
cur = a[cur];
}
int sz = v[idx].size();
cyc[sz].push_back(idx);
cnt[sz] += 1;
}
vector <int> occ;
for(auto i : cnt) {
sizes.push_back(i.first);
occ.push_back(i.second);
}
printf("%d\n", dp(1, occ));
int cur = 1;
while(cur <= n) {
int res = dp(cur, occ);
int opt = 0;
for(size_t i = 0; i < sizes.size(); i++) {
if(occ[i] > 0 && cur + sizes[i] - 1 <= n) {
occ[i] -= 1;
if(res == max(ans[cur][cur + sizes[i] - 1], dp(cur + sizes[i], occ))) {
opt = i;
break;
}
occ[i] += 1;
}
}
int cycle = cyc[sizes[opt]].back();
cyc[sizes[opt]].pop_back();
int ptr = 0;
for(int i = 0; i < sizes[opt]; i++) {
if(i & 1) {
cost[v[cycle][ptr++]] = c[cur + i];
}
}
for(int i = sizes[opt] - 1; i >= 0; i--) {
if(~i & 1) {
cost[v[cycle][ptr++]] = c[cur + i];
}
}
cur += sizes[opt];
}
for(int i = 1; i <= n; i++) {
printf("%d ", cost[i]);
}
printf("\n");
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |