Cod sursa(job #1174787)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 23 aprilie 2014 22:04:13
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define nmax 100010
#define ll long long
#define inf 1000000

class TTickes
{
    public:
        int Compute(int iLeft, int iRight);
        void ComputeSolution();
        int m_iLength, m_vData[nmax];

    protected:
        ll m_a[nmax];
        int m_q[nmax];
};

TTickes* objTickets;
ll llSol=0;

 //------------------------------------------------------------
int TTickes::Compute(int iLeft, int iRight)
{
    int r, d=iRight-iLeft+1;
    ll x=(ll) m_vData[iLeft]*d;

    if (m_vData[iLeft]==m_vData[iRight])
        r=inf;
    else
    if (x<=m_vData[iRight])
        r=-1;
    else
    {
        x-=m_vData[iRight];
        r=x/(m_vData[iRight]-m_vData[iLeft]);
        r+=iRight+1;
    }

    return r;
}
//------------------------------------------------------------
void TTickes::ComputeSolution()
{
    int i, iSt, iDr, x;

    sort (m_vData+1, m_vData+m_iLength+1);
    for (i=1; i<=m_iLength; i++)
        m_a[i]=(ll) this->m_vData[i]*(m_iLength-i+1);

    iSt=1; iDr=0;

    for (i=1; i<=m_iLength; i++)
    {
        while (iSt<iDr && Compute(m_q[iSt], m_q[iSt+1])<=i)
            iSt++;

        while (iSt<=iDr)
        {
            x=Compute(m_q[iDr], i);
            if (x==-1)
                iDr--;
            else
            if (iSt<iDr && x<Compute(m_q[iDr-1], i))
                iDr--;
            else
                break;
        }
        if (x!=inf)
            m_q[++iDr]=i;

        if ((ll) m_vData[m_q[iSt]]*(i-m_q[iSt]+1)+m_a[i+1]>llSol)
            llSol = (ll) m_vData[m_q[iSt]]*(i-m_q[iSt]+1)+m_a[i+1];
    }
}
//------------------------------------------------------------
void ReadData()
{
    FILE * fIn = fopen("avioane.in","r");

    fscanf(fIn,"%d", &objTickets->m_iLength);

    for (int i=1; i<=objTickets->m_iLength; i++)
        fscanf(fIn,"%d", &objTickets->m_vData[i]);

    fclose(fIn);
}
//------------------------------------------------------------
int main()
{

    objTickets = new TTickes();

    ReadData();
    objTickets->ComputeSolution();

    FILE * fOut = fopen("avioane.out","w");
    fprintf(fOut,"%lld\n",llSol);

    fclose(fOut);
}