Cod sursa(job #2857252)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 25 februarie 2022 10:02:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

/*******************************/
// INPUT / OUTPUT

ifstream f("scmax.in");
ofstream g("scmax.out");
/*******************************/
/// GLOBAL DECLARATIONS

int N;
int maxLen = -1, lastI;
int v[NMAX], secv[NMAX], pre[NMAX];
vector <int> sol;
/*******************************/
/// FUNCTIONS

void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
    f >> N;

    for (int i = 1 ; i <= N ; ++ i)
    {
        f >> v[i];
    }
}
///-------------------------------------
int Find(int end)
{
    int left = 1, right = maxLen;
    int pos = 0;

    while (left <= right)
    {
        int mid = (left + right) / 2;

        if (secv[mid] != 0)
        {
            if (v[secv[mid]] < end)
            {
                pos = mid;
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        else
        {
            right = mid - 1;
        }
        
    }
    return pos;
}
///-------------------------------------
inline void Solution()
{
    int seqLen;
    for (int i = 1 ; i <= N ; ++ i)
    {
        seqLen = Find(v[i]);
        if (secv[seqLen + 1] == 0)
        {
            pre[i] = secv[seqLen];
            secv[seqLen + 1] = i;
            if (maxLen < seqLen + 1)
            {
                maxLen = seqLen + 1;
                lastI = i;
            }
        }
        else
        {
            if (v[secv[seqLen + 1]] > v[i])
            {
                pre[i] = secv[seqLen];
                secv[seqLen + 1] = i;
                if (maxLen < seqLen + 1)
                {
                    maxLen = seqLen + 1;
                    lastI = i;
                }
            }
        }
    }
}
///-------------------------------------
inline void Output()
{
    g << maxLen << "\n";

    int i = lastI;

    while (i != 0)
    {
        sol.push_back(v[i]);
        i = pre[i];
    }
    reverse(sol.begin(), sol.end());

    for (auto num: sol) g << num << " ";
}
///-------------------------------------
int main()
{
    ReadInput();
    Solution();
    Output();
    return 0;
}