Cod sursa(job #2259359)

Utilizator HannaLieb Hanna Hanna Data 13 octombrie 2018 11:43:07
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.68 kb
#include <fstream>
#include <vector>
#include <algorithm>

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

int i,n,k;

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 a.i>b.i;
    return a.e<b.e;
}

int has2 (adat2 a, adat2 b)
{
    return a.i<b.i;
}

int maximum (int i, int bal, int jobb) /*i-az adott elem indexe, ahol a faban vagyunk
                                    bal-jobb az intervallum, amiben keressuk a max-ot*/
{
    if(bal<f[i].a || jobb>f[i].b || jobb<bal) return 0;
    else
    if(f[i].a==bal && f[i].b==jobb) return f[i].maxi;

    else
    {
        int maxi=0;
        if(bal>=f[i*2].a && jobb<=f[i*2].b) maxi=maximum(i*2, bal, jobb);
        else if(bal>=f[i*2+1].a && jobb<=f[i*2+1].b) maxi=maximum(i*2+1, bal, jobb);
        else maxi=max(maximum(i*2, bal, f[i*2].b), maximum(i*2+1, f[i*2+1].a, jobb));

        return maxi;
    }
}

int betesz (int i, int h, int maxim)    /*i-az adott elem indexe, ahol a faban vagyunk
                                    h-annak az elemnek az indexe a sorzatban, amit beteszunk
                                    maxim-milzen hosszu a leghosszabb reszsorozat, ha az aktualisan betett elem a vege*/
{
    if(f[i].a==f[i].b && f[i].a==h) f[i].maxi=maxim;
    else
    {
        if(f[i*2].a<=h && f[i*2].b>=h) betesz(i*2, h, maxim);
        else betesz(i*2+1, h, maxim);

        f[i].maxi=max(f[i*2].maxi, f[i*2+1].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)
    {
        k=maximum(1,1,x[i].i-1)+1;
        betesz (1,x[i].i,k);
     //   for(int j=1;j<=25;++j) cout<<f[j].a<<"-"<<f[j].b<<" "<<f[j].maxi<<"\n";
       // cout<<"\n";
        x[i].l=k;
    }

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

    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;
}