Cod sursa(job #2298320)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 7 decembrie 2018 23:42:16
Problema Sortare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#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]<<' ';
}