Cod sursa(job #1713131)

Utilizator hrazvanHarsan Razvan hrazvan Data 4 iunie 2016 19:41:47
Problema Sortare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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;
    return ;
  }
  int i, j;
  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);
    for(i = 0; i < n - 1; i++)
      rez[i]++;
    add(a[i] - 1, 1, n);
  }
  else{
    solve(n - 2);
    for(i = 0; i < n - 2; i++)
      rez[i] += 2;
    if(b[n] > a[n])
      add(a[n] - 1, 1, n - 1);
    else
      add(a[n] - 2, 1, n - 1);
    if(b[n] != a[n])
      add(b[n] - 1, 2, n);
    else{
      add(c[n] - 1, 2, n);
      b[n] = c[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;
}