답안 #239080

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
239080 2020-06-14T10:42:19 Z VEGAnn Vrtić (COCI18_vrtic) C++14
80 / 160
6 ms 640 KB
#include <bits/stdc++.h>
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")
#define i2 array<int,2>
#define PB push_back
#define all(x) x.begin(),x.end()
#define sz(x) ((int)x.size())
using namespace std;
typedef long long ll;
const int N = 510;
const int M = 20;
const ll OO = 1e18;
const int oo = 2e9;
const int md = int(1e9) + 7;
int n, nt[N], pre[N], a[N], ans[N], cnt, siz[M];
int comp[N], f[(1 << M)], pr[(1 << M)], res[N], fr[M];

void upd(int &x, int y){
    x = min(x, y);
}

int get(int lf, int rt){
    ans[0] = a[lf];

    int fi = 0, se = 0, it = 1, mx = rt - lf;

    while (it + lf < rt){
        if (it & 1){
            fi++;

            if (fi == mx) fi -= mx;

            if (fi == se) break;

            ans[fi] = a[lf + it];
        } else {
            se--;

            if (se < 0) se += mx;

            if (fi == se) break;

            ans[se] = a[lf + it];
        }

        it++;
    }

    int sum = 0;

    for (int i = 0; i < mx; i++)
        sum = max(sum, abs(ans[i] - ans[(i + 1) % mx]));

    return sum;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef _LOCAL
    freopen("in.txt","r",stdin);
#endif // _LOCAL

    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> nt[i];
        nt[i]--;
        pre[nt[i]] = i;
    }

    for (int i = 0; i < n; i++)
        cin >> a[i];

    sort(a, a + n);

    fill(comp, comp + n, -1);

    for (int i = 0; i < n; i++){
        if (comp[i] >= 0) continue;

        comp[i] = cnt;
        siz[cnt] = 1;
        fr[cnt] = i;

        int loc = nt[i];

        while (comp[loc] < 0){
            comp[loc] = cnt;
            siz[cnt]++;
            loc = nt[loc];
        }

        cnt++;
    }

    assert(cnt < 21);

    fill(f + 1, f + (1 << cnt), oo);

    f[0] = 0;

    for (int msk = 0; msk < (1 << cnt); msk++){
        int lf = 0;

        for (int i = 0; i < cnt; i++)
            if (msk & (1 << i))
                lf += siz[i];

        for (int i = 0; i < cnt; i++)
            if (!(msk & (1 << i))){
                int nw = max(f[msk], get(lf, lf + siz[i]));

                if (f[msk + (1 << i)] > nw){
                    f[msk + (1 << i)] = nw;
                    pr[msk + (1 << i)] = i;
                }
            }
    }

    cout << f[(1 << cnt) - 1] << '\n';

    int msk = (1 << cnt) - 1, sum = n;

    while (msk > 0){
        int cur = pr[msk];

        int lf = sum - siz[cur];

        get(lf, sum);

        int loc = fr[cur];

        for (int it = 0; it < siz[cur]; it++){
            res[loc] = ans[it];
            loc = nt[loc];
        }

        sum -= siz[cur];
        msk ^= (1 << cur);
    }

    for (int i = 0; i < n; i++)
        cout << res[i] << " ";

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 640 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 6 ms 640 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 640 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -