Cod sursa(job #2273154)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 31 octombrie 2018 09:32:31
Problema Sortare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
/**
  *  Worg
  */
#include <cstdio>
#include <algorithm>
FILE *fin = freopen("sortare.in", "r", stdin); FILE *fout = freopen("sortare.out", "w", stdout);

const int MAX_N = 5000 + 5;

//-------- Data --------
int n;
int a[MAX_N], b[MAX_N], c[MAX_N];

int pos[MAX_N], ans[MAX_N];
int h;
//-------- --------

void ReadInput() {
  scanf("%d", &n);

  for (int i = 2; i <= n; i++) {
    scanf("%d%d%d", &a[i], &b[i], &c[i]);
  }
}

void Solve(int size) {
  if(size <= 0) {
    return;
  }

  h++;
  if(size == 1) {
    ans[pos[1]] = 1; return;
  }

  if (a[size] != b[size] && a[size] != c[size] && b[size] != c[size]) {  ///  Case 1 : they are all distinct
    ans[pos[c[size]]] = size;
    ans[pos[b[size]]] = size - 1;

    std::swap(pos[size], pos[c[size]]);
    std::swap(pos[size - 1], pos[b[size]]);

    Solve(size - 2);
  } else {  ///  Case 2 : we have at least two equal elements
    if (a[size] == b[size]) {
      ans[pos[a[size]]] = size;
      std::swap(pos[a[size]], pos[size]);
    } else if (b[size] == c[size]) {
      ans[pos[b[size]]] = size;
      std::swap(pos[b[size]], pos[size]);
    }

    Solve(size - 1);
  }
}

void PrintOutput() {
  printf("%d\n", h);
  for (int i = 1; i <= n; i++) {
    printf("%d ", ans[i]);
  }
}

int main() {
  ReadInput();

  for (int i = 1; i <= n; i++) {
    pos[i] = i;
  }

  Solve(n);

  PrintOutput();
  return 0;
}