Cod sursa(job #2553670)

Utilizator paul3ioanCirstean Paul Ioan paul3ioan Data 22 februarie 2020 10:59:50
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
////#include <iostream>
//#include <fstream>
//using namespace std;
//ifstream cin("scmax.in");
//ofstream cout("scmax.out");
//const int N = 100003;
//int n ;
//int pozmax;
//int v[N], dp[N], urm[N];
//int main() {
//    cin >> n;
//    for( int i =1 ;i <=n;i++)
//        cin >> v[i];
//    dp[n] = 1; urm[n] = 0;
//    for( int i = n - 1 ; i > 0 ; i--)
//    {
//        dp[i] = 1; urm[i] = 0;
//        for( int j =i  + 1 ;j <=n ;j ++)
//        {
//            if(v[i] < v[j] and dp[i] < dp[j] + 1)
//            {
//                dp[i] = 1 + dp[j];
//                urm[i] = j;
//            }
//        }
//    }
//    /// det lungimea maxima
//    int maxim = dp[1];
//    pozmax = 1;
//    for( int i = 2 ;i <=n;i ++)
//        if(maxim < dp[i]){
//            maxim = dp[i];
//            pozmax = i;
//        }
//    cout << maxim<< '\n';
//    /// afisez subsir cresc de lungime max
//    int i = pozmax;
//    while( i  != 0)
//    {
//        cout << v[i]<<" ";
//        i = urm[i];
//    }
//    return 0;
//}
#include <fstream>
//#include <iostream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int N = 1000001;
int n;
int lgbest;
int sol[N];
int poz[N], best[N], v[N];
int cauta( int x)
{
    int inc = 0 , sf = lgbest + 1, mid;
    while(sf - inc > 1)
    {
        int mid = (sf + inc) / 2;
        if(best[mid] < x)
            inc = mid;
        else
            sf = mid;
    }
    return sf;
}
int main()
{
    cin >> n;
    for( int i =1 ;i <=n;i ++)
        cin >> v[i];
    best[1] = v[1];
    poz[1] = 1;
    lgbest = 1;
    int pozx;
    for( int i =2 ;i <=n;i++)
    {
        if(v[i] > best[lgbest])
            best[++lgbest] = v[i] , poz[i]= lgbest;
        else
        {
            pozx = cauta(v[i]);
            best[pozx] = v[i];
            poz[i] = pozx;
        }
    }
    ///afisare
    cout << lgbest<<'\n';
    for(int i =lgbest, j = n; i > 0; j--)
    {
        if(poz[j] == i)
            sol[i] = v[j] , i --;
    }
    for( int i =1 ;i <=lgbest ;i ++)
        cout <<sol[i]<<" ";
}