Mai intai trebuie sa te autentifici.
Cod sursa(job #171430)
Utilizator | Data | 4 aprilie 2008 12:45:16 | |
---|---|---|---|
Problema | Sortare | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.26 kb |
#include <stdio.h>
#include <string.h>
const int nm = 5010;
inline void swap(int& a, int& b)
{
if(a > b)
{
int temp;
temp = a;
a = b;
b = temp;
}
}
int main()
{
freopen("sortare.in", "r", stdin);
freopen("sortare.out", "w", stdout);
int crt[nm], prev1[nm], prev2[nm], sol[nm], n, l, i, j, temp;
int a, b, c;
memset(crt, 0, sizeof(crt));
memset(prev1, 0, sizeof(prev1));
memset(prev2, 0, sizeof(prev2));
memset(sol, 0, sizeof(sol));
prev1[1] = 1;
sol[1] = sol[0] = 1;
scanf("%d", &n);
for(l = 2; i <= n; ++l)
{
scanf("%d %d %d", &a, &b, &c);
swap(a, b);
swap(b, c);
swap(a, b);
if(a == b || b == c)
{
sol[l] = sol[l - 1] + 1;
crt[b] = 1;
for(i = 1, temp = 0; i <= l; ++i)
{
if(!crt[i])
{
crt[i] = prev1[++temp] + 1;
}
}
}
else
{
sol[l] = sol[l - 2] + 1;
crt[a] = 1;
crt[b] = 2;
for(i = 1, temp = 0; i <= l; ++i)
{
if(!crt[i])
{
crt[i] = prev2[++temp] + 2;
}
}
}
/*
for(i = 1; i <= l; ++i)
{
printf("%d ", crt[i]);
}
printf("\n");
*/
memcpy(prev2, prev1, sizeof(prev1));
memcpy(prev1, crt, sizeof(crt));
memset(crt, 0, sizeof(crt));
}
printf("%d\n", sol[n]);
for(i = 1; i <= n; ++i)
{
printf("%d ", prev1[i]);
}
printf("\n");
return 0;
}