Pagini recente » Arhiva de probleme | Cod sursa (job #1718146) | Profil Tokumei_no_Kage | Monitorul de evaluare | Cod sursa (job #163780)
Cod sursa(job #163780)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define nmax 5005
#define inf 0x3f3f3f3f
#define pb push_back
#define min(i,j) ((i) > (j) ? (j) : (i))
#define max(i,j) ((i) > (j) ? (i) : (j))
using namespace std;
int n, lungime = 0;
int a[nmax], b[nmax], c[nmax];
int d[nmax], piv[nmax];
vector <int> rez;
vector <int> reconst(int first, int last)
{
int l = last - first + 1;
vector <int> crt, st, dr;
crt.clear();
if(l == 0) return crt;
else if(l == 1) crt.pb(first);
else if(l == 2)
{
for(int i = first; i <= last; i++) crt.pb(i);
}
else
{
if(first + piv[l] - 2 >= first) st = reconst(first, first + piv[l] - 2);
if(first + piv[l] <= last) dr = reconst(first + piv[l], last);
for(int i = first; i <= last; i++) crt.pb(0);
crt[b[l] - 1] = first + piv[l] - 1;
int lp = l - 1;
if(st.size() == 0)
{
int lp = 0;
for(int i = 0; i < (int)dr.size(); i++)
{
while(crt[lp] != 0) lp++;
crt[lp] = dr[i];
}
}
else if(dr.size() == 0)
{
int lp = 0;
for(int i = 0; i < (int)st.size(); i++)
{
while(crt[lp] != 0) lp++;
crt[lp] = st[i];
}
}
else
{
for(int i = (int)st.size() - 1; i > 0; i--)
{
while(crt[lp] != 0 || lp == c[l] - 1) lp--;
crt[lp] = st[i];
}
if(lp > a[l] - 1 && crt[a[l] - 1] == 0) crt[a[l] - 1] = st[0];
else
{
while(crt[lp] != 0 || lp == c[l] - 1) lp--;
crt[lp] = st[0];
}
lp = 0;
for(int i = 0; i < (int)dr.size(); i++)
{
while(crt[lp] != 0) lp++;
crt[lp] = dr[i];
}
}
}
return crt;
}
int mediana(vector <int> A, int x, int y, int z)
{
int v1 = A[x], v2 = A[y], v3 = A[z];
if(v1 > v2) swap(v1, v2);
if(v1 > v3) swap(v1, v3);
if(v2 > v3) swap(v2, v3);
return v2;
}
vector <int> verif(vector <int> A, int niv)
{
if(niv > lungime) lungime = niv;
if(A.size() <= 1) return A;
else
{
int l = A.size();
int piv = mediana(A, a[l] - 1, b[l] - 1, c[l] - 1);
vector <int> st, dr;
for(int i = 0; i < (int)A.size(); i++)
if(A[i] < piv) st.pb(A[i]);
else if(A[i] > piv) dr.pb(A[i]);
st = verif(st, niv + 1);
dr = verif(dr, niv + 1);
A.clear();
for(int i = 0; i < (int)st.size(); i++) A.pb(st[i]);
A.pb(piv);
for(int i = 0; i < (int)dr.size(); i++) A.pb(dr[i]);
return A;
}
}
int main()
{
freopen("sortare.in", "r", stdin);
freopen("sortare.out", "w", stdout);
scanf("%d", &n);
for(int i = 2; i <= n; i++)
{
scanf("%d%d%d", &a[i], &b[i], &c[i]);
if(a[i] > b[i]) swap(a[i], b[i]);
if(a[i] > c[i]) swap(a[i], c[i]);
if(b[i] > c[i]) swap(b[i], c[i]);
}
d[1] = 1, d[2] = 2;
for(int i = 3; i <= n; i++)
{
d[i] = 0;
if(a[i] == b[i] || a[i] == c[i] || b[i] == c[i]) d[i] = d[i - 1] + 1, piv[i] = 1;
for(int j = 2; j < i; j++)
if(max(d[j - 1], d[i - j]) + 1 > d[i])
d[i] = max(d[j - 1], d[i - j]) + 1, piv[i] = j;
}
printf("%d\n", d[n]);
rez = reconst(1, n);
for(int i = 0; i < (int)rez.size(); i++) printf("%d ", rez[i]); printf("\n");
return 0;
}