Cod sursa(job #1713139)

Utilizator hrazvanHarsan Razvan hrazvan Data 4 iunie 2016 20:00:55
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXN 5000
#define pb(x) push_back(x)
int a[MAXN + 1], b[MAXN + 1], c[MAXN + 1];
int nr = 0;
int rez[MAXN];

inline void add(int x, int y, int n){
  int i;
  for(i = n - 2; i >= x; i--)
    rez[i + 1] = rez[i];
  rez[x] = y;
}

void solve(int n){
  nr++;
  if(n < 3){
    rez[0] = 1;
    if(n == 2){
      rez[1] = 2;
      nr++;
    }
    return ;
  }
  if(a[n] == b[n] || a[n] == c[n] || b[n] == c[n]){
    if(b[n] == c[n])
      a[n] = b[n];
    solve(n - 1);
    add(a[n] - 1, n, n);
  }
  else{
    solve(n - 2);
    if(b[n] > a[n])
      add(a[n] - 1, n - 1, n - 1);
    else
      add(a[n] - 2, n - 1, n - 1);
    add(b[n] - 1, n, n);
  }
}

int main(){
  FILE *in = fopen("sortare.in", "r");
  int n, i;
  fscanf(in, "%d", &n);
  for(i = 2; i <= n; i++)
    fscanf(in, "%d%d%d", &a[i], &b[i], &c[i]);
  fclose(in);
  solve(n);
  FILE *out = fopen("sortare.out", "w");
  fprintf(out, "%d\n", nr);
  for(i = 0; i < n; i++)
    fprintf(out, "%d ", rez[i]);
  fclose(out);
  return 0;
}