Submission #943962

#TimeUsernameProblemLanguageResultExecution timeMemory
943962RGBBVrtić (COCI18_vrtic)C++14
80 / 160
343 ms19924 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX = 150;

int n;

int a[MAX], b[MAX], outp[MAX];

int ran[MAX][MAX];
vector<int> dis[MAX][MAX];
void calcRan() {
    for(int i = 0; i < n; i++) {
        for(int j = i; j < n; j++) {
            int tsi = j - i + 1;
            vector<int> sv(tsi), tout(tsi);
            for(int k = i; k <= j; k++) sv[k - i] = b[k];
            tout[0] = sv[0];
            for(int k = 1; k < tsi; k++) {
                if(k % 2) tout[(k + 1) / 2] = sv[k];
                else tout[tsi - k / 2] = sv[k];
            }
            ran[i][j] = abs(tout[tsi - 1] - tout[0]);
            for(int k = 0; k < tsi - 1; k++) ran[i][j] = max(ran[i][j], abs(tout[k + 1] - tout[k]));
            dis[i][j] = tout;
        }
    }
}

int g;
vector<int> cyc[MAX];
void calcCycles() {
    vector<bool> flag(n);
    for(int i = 0; i < n; i++) {
        if(flag[i]) continue;
        int cur = i;
        while(!flag[cur]) {
            flag[cur] = true;
            cyc[g].push_back(cur);
            cur = a[cur];
        }
        g++;
    }
}

void solve() {
    vector<int> dp(1 << g, INT_MAX), prev(1 << g);
    dp[0] = 0;
    prev[0] = -1;
    for(int i = 1; i < (1 << g); i++) {
        int sum = 0;
        for(int j = 0; j < g; j++) {
            if(i & (1 << j)) sum += cyc[j].size();
        }
        for(int j = 0; j < g; j++) {
            if(i & (1 << j)) {
                int s = cyc[j].size();
                sum -= s;
                int pot = max(dp[i ^ (1 << j)], ran[sum][sum + s - 1]);
                if(pot < dp[i]) {
                    dp[i] = pot;
                    prev[i] = i ^ (1 << j);
                }
                sum += s;
            }
        }
    }
    vector<int> vis;
    int ind = (1 << g) - 1;
    while(ind != -1) {
        vis.push_back(ind);
        ind = prev[ind];
    }
    reverse(vis.begin(), vis.end());
    int curn = 0;
    for(int i = 1; i < vis.size(); i++) {
        int cm = vis[i];
        int pm = vis[i - 1];
        for(int j = 0; j < g; j++) {
            if((cm ^ pm) == (1 << j)) {
                int s = cyc[j].size();
                for(int k = 0; k < s; k++) {
                    outp[cyc[j][k]] = dis[curn][curn + s - 1][k];
                }
                curn += s;
                break;
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
    }
    for(int i = 0; i < n; i++) cin >> b[i];
    sort(b, b + n);
    calcRan();
    calcCycles();
    solve();
    int bv = INT_MIN;
    for(int i = 0; i < n; i++) bv = max(bv, abs(outp[i] - outp[a[i]]));
    cout << bv << "\n";
    for(int i = 0; i < n - 1; i++) cout << outp[i] << " ";
    cout << outp[n - 1] << "\n";
}

Compilation message (stderr)

vrtic.cpp: In function 'void solve()':
vrtic.cpp:76:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |     for(int i = 1; i < vis.size(); i++) {
      |                    ~~^~~~~~~~~~~~
#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...