Cod sursa(job #1785172)

Utilizator ionutpop118Pop Ioan Cristian ionutpop118 Data 20 octombrie 2016 22:06:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int a[100001];
vector <int> q, p, sol;
vector <int>::iterator it;
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n,poz;
    scanf("%d",&n);
    for (register int i = 0; i < n; ++i)
        scanf("%d", &a[i]);
    /*
    /// lis crescator ///
    q.push_back(a[0]);
    p.push_back(0);
    for (register int i = 1; i < n; ++i)
    {
        it = upper_bound(q.begin(), q.end(), a[i]);
        if (it == q.end())
        {
            q.push_back(a[i]);
            poz = q.size() -1;
            p.push_back(poz);
        }
        else
        {
            poz = (int)(it - q.begin());
            *it = a[i];
            p.push_back(poz);
        }
    }
    int lis = q.size();
    printf("%d\n", lis);
    poz = p.size() - 1;
    for (register int i = lis - 1; i >= 0; --i)
        for ( ; poz >= 0; --poz)
        {
            if (p[poz] == i)
            {
                sol.push_back(a[poz]);
                break;
            }
        }
    reverse(sol.begin(), sol.end());
    for (register int i = 0; i < sol.size(); ++i)
        printf("%d ",sol[i]);
    printf("\n");
    q.clear();
    p.clear();
    sol.clear();*/
    /// lis strict crescator ///
    q.push_back(a[0]);
    p.push_back(0);
    for (register int i = 1; i < n; ++i)
    {
        it = lower_bound(q.begin(), q.end(), a[i]);
        if (*it == a[i])
        {
            poz = (int)(it - q.begin());
            p.push_back(poz);
            continue;
        }

        if (it == q.end())
        {
            q.push_back(a[i]);
            poz = q.size() -1;
            p.push_back(poz);
        }
        else
        {
            *it = a[i];
            poz = (int)(it - q.begin());
            p.push_back(poz);
        }

    }
    int lis = q.size();
    printf("%d\n", lis);
    poz = p.size() - 1;
    for (register int i = lis - 1; i >= 0; --i)
        for ( ; poz >= 0; --poz)
        {
            if (p[poz] == i)
            {
                sol.push_back(a[poz]);
                break;
            }
        }
    reverse(sol.begin(), sol.end());
    for (register int i = 0; i < sol.size(); ++i)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;
}