Pagini recente » Cod sursa (job #2394207) | Cod sursa (job #756414) | Cod sursa (job #1937286) | Cod sursa (job #1732726) | Cod sursa (job #2298320)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream cin("sortare.in");
ofstream cout("sortare.out");
int N,n,x,y,k,cnt;
vector<int> Poz[5005];
int sol[5005],index[5005];
/**
Pe index il folosesc pentru a simula un
quicksort pe indici, si pun valorile corespunzatoare
(vezi indicatiile la problema) pe pozitia indicilor de la
A[i], B[i] sau C[i].
**/
int main(){
cin>>n; index[1]=1; N=n;
for(int i=2;i<=n;i++){
index[i]=i;
for(int j=1;j<=3;j++){
cin>>x; Poz[i].push_back(x);
}
}
for(int i=2;i<=n;i++)
sort(Poz[i].begin(),Poz[i].end());
cnt=1;
while(n>1){
/**
In cazul in care toti indicii sunt diferiti,
aleg pe ultimii doi in ordine crescatoare
**/
if(Poz[n][0]!=Poz[n][1] & Poz[n][0]!=Poz[n][2] && Poz[n][1]!=Poz[n][2]){
y=Poz[n].back();
Poz[n].pop_back();
x=Poz[n].back();
sol[index[x]]=n-1;
sol[index[y]]=n;
k=0;
for(int i=1;i<=n;i++)
if(!sol[index[i]]) index[++k]=index[i];
n-=2;
}
/**
ATENTIE:
Pentru A[i], B[i] si C[i],
atunci cand doi indici sunt egali, pivotul va fi
valoarea de la indicele care se repeta,
indiferent de cat de mare sau mica e valoarea.
**/
else{
Poz[n].pop_back();
x=Poz[n].back();
sol[index[x]]=n;
k=0;
for(int i=1;i<=n;i++)
if(!sol[index[i]]) index[++k]=index[i];
--n;
}
++cnt;
}
sol[index[1]]=1;
cout<<cnt<<'\n';
for(int i=1;i<=N;i++)
cout<<sol[i]<<' ';
}