Cod sursa(job #2335353)

Utilizator retrogradLucian Bicsi retrograd Data 3 februarie 2019 22:35:58
Problema Sortare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

int Build(int l, int r, 
        vector<int>& pos, vector<int>& ret, vector<int>& a, 
        vector<int>& b, vector<int>& c) {
    if (pos.empty()) return 1;
    if (pos.size() == 1) {
        assert(l == r);
        ret[pos[0]] = l;
        return 1;
    }

    int len = r - l + 1;
    if (a[len] == b[len]) {
        ret[pos[a[len]]] = l;
        pos.erase(pos.begin() + a[len]);
        return 1 + Build(l + 1, r, pos, ret, a, b, c);
    }
    if (b[len] == c[len]) {
        ret[pos[c[len]]] = r;
        pos.erase(pos.begin() + c[len]);
        return 1 + Build(l, r - 1, pos, ret, a, b, c);
    }
    ret[pos[b[len]]] = r - 1;
    ret[pos[c[len]]] = r;
    pos.erase(pos.begin() + max(b[len], c[len]));
    pos.erase(pos.begin() + min(b[len], c[len]));
    return 1 + Build(l, r - 2, pos, ret, a, b, c);
}

int main() {
    ifstream cin("sortare.in");
    ofstream cout("sortare.out");

    int n; cin >> n;
    vector<int> a(n + 1), b(n + 1), c(n + 1);
    for (int i = 2; i <= n; ++i) {
        cin >> a[i] >> b[i] >> c[i];
        --a[i]; --b[i]; --c[i];
        if (a[i] > b[i]) swap(a[i], b[i]);
        if (a[i] > c[i]) swap(a[i], c[i]);
        if (b[i] > c[i]) swap(b[i], c[i]);
    }

    vector<int> ret(n);
    vector<int> pos(n);
    iota(pos.begin(), pos.end(), 0);
    int max = Build(1, n, pos, ret, a, b, c);
    cout << max << endl;
    for (int i = 0; i < n; ++i)
        cout << ret[i] << " ";
    cout << endl;

    return 0;
}