Cod sursa(job #2336697)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 5 februarie 2019 14:09:36
Problema Sortare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 5000;

int a[MAXN + 1], b[MAXN + 1], c[MAXN + 1];
int pos[MAXN + 1], sol[MAXN + 1], n;

void solve(int l, int r, int &ans) {
    int len = r - l + 1;
    if(len <= 0) {
        return ;
    }
    ans++;
    if(len == 1) {
        return ;
    }
    int sz = 0;
    for(int i = 1; i <= n; i++) {
        if(sol[i] == 0) {
            pos[++sz] = i;
        }
    }
    int x = pos[a[len]], y = pos[b[len]], z = pos[c[len]];
    sol[x] = len;
    if(x == y || x == z) {
        solve(l, r - 1, ans);
    }
    else {
        if(x != y) {
            sol[y] = len - 1;
        }
        else {
            sol[z] = len - 1;
        }
        solve(l, r - 2, ans);
    }
}

int main() {
    ifstream cin("sortare.in");
    ofstream cout("sortare.out");
    int i;
    ios::sync_with_stdio(false);
    cin >> n;
    for(i = 2; i <= n; i++) {
        cin >> a[i] >> b[i] >> c[i];
        if(b[i] == c[i]) {
            swap(a[i], c[i]);
        }
    }
    int ans = 0;
    solve(1, n, ans);
    cout << ans << "\n";
    for(i = 1; i <= n; i++) {
        if(sol[i] == 0) {
            sol[i] = 1;
        }
        cout << sol[i] << " ";
    }
    cin.close();
    cout.close();
    return 0;
}