Cod sursa(job #3030228)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 17 martie 2023 16:03:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int nmax = 100000;
int dp[nmax + 1]; ///dp[x] sirul de lungime x care se termina in valorea lui dp[x]
vector<int>afis;
int v[nmax + 1];
int poz[nmax + 1];

int find_better(int value, int cnt)
{
    int idx;
    int st = 1;
    int dr = cnt;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(dp[mij] >= value)
        {
            dr = mij - 1;
            idx = mij;
        }
        else
            st = mij + 1;
    }
    return idx;
}
int main()
{
    int n;
    in>>n;
    int cnt = 0;
    for(int i = 1; i <= n; i++)
    {
        in>>v[i];
        if(dp[cnt] < v[i]) ///gasesc un nr mai mare =>prelungesc secventa
        {
            cnt++;
            dp[cnt] = v[i];
            poz[i] = cnt;
        }
        else///gasesc cel mai mic dp mai mare decat v[i]
        {
            int index = find_better(v[i],cnt);
            dp[index] = v[i];
            poz[i] = index;
        }
    }
    out<<cnt<<'\n';

    for(int i = n; i >= 1; i--)
    {
        if(poz[i] == cnt)
        {
            cnt--;
            afis.push_back(v[i]);
        }
    }
    for(int i = afis.size() - 1; i >= 0; i--)
        out<<afis[i]<<' ';
    return 0;
}