Cod sursa(job #1798803)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 5 noiembrie 2016 14:11:03
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <vector>

#define nmax 100010

using namespace std;

ifstream f ("scmax.in");
ofstream t ("scmax.out");

vector <int> v,sol;
int q[nmax],d[nmax],tata[nmax],nr=0;

int bin_search(int x)
{
    int st=1,dr=nr;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(x<=v[q[mid]]) dr=mid-1;
        else st=mid+1;
    }
    return st;
}

int main()
{   int x,n;
    f>>n;
    for (int i=0;i<n;++i)
        f>>x,v.push_back(x);
    for(int i=0;i<n;++i){
        int pos=bin_search(v[i]);
        if(pos>nr) ++nr;
        q[pos]=i;
        d[i]=d[q[pos-1]]+1;
        tata[i]=q[pos-1];
    }
    int max=-1,pos;
    for(int i=1;i<=n;i++)
        if(d[i]>max) max=d[i],pos=i;
    for(int i=pos;i>0;i=tata[i])
        sol.push_back(v[i]);
    t<<sol.size()<<'\n';
    for (vector<int>::iterator i=sol.end()-1;i>=sol.begin();--i)
        t<<*i<<" ";
    return 0;
}