Cod sursa(job #2699355)

Utilizator Botzki17Botocan Cristian-Alexandru Botzki17 Data 24 ianuarie 2021 11:52:36
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100000;
int dp[NMAX+5];
int v[NMAX+5];
int ml[NMAX+5]; /// pt lungimea i a subsirului crescator este poszitia valorii minime pt care exista un subsir crescator de lungime i
///cu aceasta pozitie ca final (ml inseamna minim pentru lungime)

int cautare_binara(int val, int st, int dr)
{
    int last = 0;
    while(st<=dr)
    {
       int mid = (st + dr)>>1;
       if(ml[mid] < val)
       {
          last = mid;
          st = mid + 1;
       }
       else dr = mid -1;
    }
    return last;
}

int main()
{
    int n, i;
    fin>>n;
    for(i = 1;i<=n;i++)
        {
            fin>>v[i];
            ml[i] = INT_MAX;
        }
    dp[1] = 1;
    int lungime_maxima = 0;
    for(i = 1;i <=n;i++)
    {
        int lsubsir = cautare_binara(v[i], 1, i-1);
        if(lungime_maxima < lsubsir + 1)
            lungime_maxima = lsubsir +1;
        dp[i] = lsubsir + 1;
        if(ml[lsubsir + 1] > v[i])
            ml[lsubsir+1] = v[i];

    }
    stack<int> st;
    fout<<lungime_maxima<<"\n";
    for(int i=n; i >=1;i--)
    {
        if(dp[i] == lungime_maxima)
        {
             st.push(v[i]);
             lungime_maxima--;
        }
    }
    while(!st.empty())
    {
         fout<<st.top()<<" ";
         st.pop();
    }
    return 0;
}