Cod sursa(job #1014834)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 23 octombrie 2013 15:10:14
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 3.72 kb
#include <stdio.h>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <vector>

using namespace std;

const int _iMaxLength = 3e6+1;

class TOrderStatistics
{
    public:
        TOrderStatistics(int iKthPosition);
        ~TOrderStatistics();

        int AddData(int iNewValue);
        void ComputeOrder(int iKthPosition);

        friend ostream &operator<<(ostream &fOutput, TOrderStatistics &objElement)
        {
            #ifndef INFOARENA
                std::vector<int>::iterator itIndex;

                for (itIndex=objElement.m_vData.begin(); itIndex!=objElement.m_vData.end(); ++itIndex)
                {
                    fOutput<<*itIndex;
                }
                fOutput << endl;
            #endif // INFOARENA
            fOutput << objElement.m_vData[objElement.iKthPosition];

            return fOutput;
        }
        void PrintData(FILE * fOut) {fprintf(fOut,"%d",this->m_vData[this->iKthPosition]);}

    private:
        int Part(int li, int lf);
        void Sel(int li, int lf, int k);

        int iKthPosition;
    protected:
        vector <int> m_vData;
};

//--------------------------------------------
//--------------------------------------------
//--------------------------------------------
TOrderStatistics::TOrderStatistics(int iKthPosition)
{
    this->iKthPosition=iKthPosition;
    this->m_vData.clear();
}
//--------------------------------------------
TOrderStatistics::~TOrderStatistics()
{
    this->m_vData.clear();
}
//--------------------------------------------
int TOrderStatistics::AddData(int iNewValue)
{
    m_vData.push_back(iNewValue);
}
//--------------------------------------------
int TOrderStatistics::Part(int iLeft, int iRight)
{
    int iIndex1 = iLeft-1; int iIndex2 = iRight+1;
    int p = this->m_vData[iLeft];

    while(1)
    {
        do
        {
           --iIndex2;
        } while(p < this->m_vData[iIndex2]);

        do
        {
           ++iIndex1;
        } while(this->m_vData[iIndex1] < p);

        if(iIndex1 < iIndex2) swap(this->m_vData[iIndex1], this->m_vData[iIndex2]);
        else return iIndex2;
    }

    return 0;
}
//--------------------------------------------
void TOrderStatistics::Sel(int iLeft, int iRight, int iKthPosition)
{
    if(iLeft == iRight) return;

    int iSol = this->Part(iLeft, iRight);
    int iPos = iSol-iLeft+1;

    if(iPos >= iKthPosition) this->Sel(iLeft, iSol, iKthPosition);
    else this->Sel(iSol+1, iRight, iKthPosition-iPos);

}
//--------------------------------------------
void TOrderStatistics::ComputeOrder(int iKthPosition)
{
 //   printf("%d",this->m_vData.size());
    this->Sel(1, this->m_vData.size() , iKthPosition);
}
//--------------------------------------------
//--------------------------------------------
int ReadData(TOrderStatistics * objStatistics, int * iKthPosition)
{
    FILE * fIn = fopen("sdo.in","r");
    int iLength;

    fscanf(fIn,"%d %d",&iLength,iKthPosition);
    *iKthPosition=*iKthPosition+1;

    objStatistics = new TOrderStatistics(*iKthPosition);
    int iNumber;

    objStatistics->AddData(0);

    for(int iIndex = 0; iIndex < iLength; iIndex++)
    {
        fscanf(fIn,"%d",&iNumber);
        objStatistics->AddData(iNumber);
    }

    fclose(fIn);


    objStatistics->ComputeOrder(*iKthPosition);

    FILE * fOut = fopen("sdo.out","w");
    objStatistics->PrintData(fOut);
    fclose(fOut);

    //ofstream fOut ("sdo.out");
    //fOut << objStatistics << "\n";

    return 1;
}
//--------------------------------------------
int main()
{
    TOrderStatistics * objStatistics;

    int iKthPosition;
    ReadData(objStatistics,&iKthPosition);

}