Cod sursa(job #2258960)

Utilizator HannaLieb Hanna Hanna Data 12 octombrie 2018 18:08:07
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");

int i,n;

struct adat
{
    int a,b,maxi;   /*a-bal veg; b-jobb veg; maxi-leghosszabb monoton novekvo
                        reszsorozat hossza az a-b intervallumon*/
};
vector<adat>f(262144);  /*intervallumfa*/

struct adat2
{
    int i,e,l;      /*i-index, e-ertek*/
};
vector<adat2>x;     /*a sorozatom*/

int fa (int bal, int jobb, int i)
{
    f[i].a=bal;
    f[i].b=jobb;
    f[i].maxi=0;

    if(bal!=jobb)
    {
        fa(bal, (bal+jobb)/2, i*2);
        fa((bal+jobb)/2+1, jobb, i*2+1);
    }
}

int has (adat2 a, adat2 b)
{
    if(a.e>b.e) return 0;
    else if(a.e==b.e) return (a.i>b.i);
}

int has2 (adat2 a, adat2 b)
{
    if(a.i>b.i) return 0;
}

int betesz (int i, int h)    /*i-az adott elem indexe, ahol a faban vagyunk
                                    h-annak az elemnek az indexe a sorzatban, amit beteszunk*/
{
    if(f[i].a==f[i].b && f[i].a==h) f[i].maxi=1;
    else
    {
        if(f[i*2].a<=h && f[i*2].b>=h)
        {
            betesz(i*2, h);
            if(f[i*2+1].maxi==0) f[i].maxi=max(f[i].maxi, f[i*2].maxi);
        }
        else
        {
            int k=f[i*2+1].maxi;
            betesz(i*2+1, h);
            if(k!=f[i*2+1].maxi)f[i].maxi++;
        }
    }
}

int main()
{
    cin>>n;

    fa(1,n,1);
    x.resize(n+1);

    for(i=1;i<=n;++i)
    {
        cin>>x[i].e;
        x[i].i=i;
    }

    sort(x.begin(), x.end(), has);

    for(i=1;i<=n;++i)
    {
        betesz (1,x[i].i);
      //  for(int j=1;j<=9;++j) cout<<f[j].a<<"-"<<f[j].b<<" "<<f[j].maxi<<"\n";
        //cout<<"\n";
        x[i].l=f[1].maxi;
    }

    sort(x.begin(), x.end(), has2);

    int k=f[1].maxi;

    vector<int>megold(k+1);

    for(i=n;i>=1;--i)
    {
        if(x[i].l==k)
        {
            megold[k]=x[i].e;
            k--;
        }
    }

    cout<<f[1].maxi<<"\n";
    for(i=1;i<=f[1].maxi;++i) cout<<megold[i]<<" ";

    return 0;
}