Cod sursa(job #1595875)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 10 februarie 2016 16:41:48
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100000 + 1;

int finalKeys[MAX_N];
vector<int> subsequences[MAX_N];
int A[MAX_N];
int N, numberSubseqs;

int binSearch(int key)
{
    int l = 1, r = numberSubseqs;
    int ans = numberSubseqs + 1;

    while (l <= r)
    {
        int m = (l + r) / 2;

        if (finalKeys[m] >= key)
        {
            l = m + 1;
        }
        else
        {
            ans = m;
            r = m - 1;
        }
    }

    return ans;
}

int main()
{
    ifstream in("scmax.in");
    ofstream out("scmax.out");

    in >> N;

    for (int i = 1; i <= N; ++i)
        in >> A[i];

    for (int i = 1; i <= N; ++i)
    {
        int p = binSearch(A[i]);

        if (p > numberSubseqs)
        {
            numberSubseqs++;
            finalKeys[numberSubseqs] = A[i];
            subsequences[numberSubseqs].emplace_back(A[i]);
        }
        else
        {
            if (subsequences[p].size() == 0)
                throw "empty subseq";

            if (subsequences[p].back() != A[i])
                subsequences[p].emplace_back(A[i]);

            finalKeys[p] = A[i];
        }
    }

    int best = 0;
    int ind = 0;

    for (int i = 1; i <= numberSubseqs; ++i)
    {
        if ((int)subsequences[i].size() > best)
        {
            best = subsequences[i].size();
            ind = i;
        }
    }

    out << best << "\n";

    for (int x : subsequences[ind])
        out << x << " ";

    out << "\n";


    return 0;
}