Cod sursa(job #317658)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 24 mai 2009 19:16:20
Problema Sortare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>  
#include <vector>  
  
#define maxN 5001  
  
int N;  
int S[3][maxN], Cnt[maxN];  
  
void Swap(int &i, int &j)  
{  
    int t = i;  
    i = j;  
    j = t;  
}  
  
int main()  
{  
    freopen("sortare.in", "rt", stdin);  
    freopen("sortare.out", "wt", stdout);  
      
    S[0][0] = 0;  
    S[1][1] = 1;  
    Cnt[0] = 1;  
    Cnt[1] = 1;  
      
    int i;  
    for(scanf("%d", &N), i=2; i<=N; ++i)  
    {  
        int a, b, c;  
        scanf("%d %d %d", &a, &b, &c);  
          
        memset(S[i%3], 0, sizeof(S[i%3]));  
          
        if(a > b) Swap(a, b);  
        if(a > c) Swap(a, c);  
        if(b > c) Swap(b, c);  
          
        int j, k;  
        if(a != b && b != c)  
        {  
            S[i%3][a] = 1;  
            S[i%3][b] = 2;  
            k = 0;  
              
            for(j=1; j<=i; ++j)  
                if(!S[i%3][j]) S[i%3][j] = S[(i-2)%3][++k] + 2;  
                  
            Cnt[i] = Cnt[i-2] + 1;  
        }  
        else  
        {  
            if(a == b)  
                S[i%3][a] = 1;  
            else  
                S[i%3][b] = 1;  
                  
            k = 0;  
            for(j=1; j<=i; ++j)  
                if(!S[i%3][j]) S[i%3][j] = S[(i-1)%3][++k] + 1;  
  
            Cnt[i] = Cnt[i-1] + 1;  
        }  
    }  
  
    printf("%d\n", Cnt[N]);  
      
    for(i=1; i<=N; ++i)  
        printf("%d ", S[N%3][i]);  
      
    fclose(stdin);  
    fclose(stdout);  
    while (0==0)
    {
     ++i;
    }
    return 0;  
}