Cod sursa(job #1276886)

Utilizator gabrieligabrieli gabrieli Data 26 noiembrie 2014 22:43:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <limits>
#include <iterator>

using namespace std;

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    
    int n;
    vector<int> V;
    
    fin >> n;
    copy_n(istream_iterator<int>(fin), n, back_inserter(V));
    
    vector<int> DP;
    vector<int> seq_tail;
    seq_tail.push_back(numeric_limits<int>::min());    
    
    for (int i = 0; i < V.size(); ++i)
    {
        auto it = upper_bound(seq_tail.begin(), seq_tail.end(), V[i]);
        int L = (it - 1) - seq_tail.begin() + 1;
        
        if (*(it - 1) != V[i])
        {
            DP.push_back(L);
            
            if (seq_tail.size() <= L)
                seq_tail.push_back(V[i]);
            else seq_tail[L] = V[i];
        }
        else
            DP.push_back(L - 1);
    }
    
    auto m = max_element(DP.begin(), DP.end());
    fout << *m << endl;
    
    int prev = numeric_limits<int>::max();
    int pos = *m;
    vector<int> result;
    for (int i = m - DP.begin(); pos; --i)
    {
        if (pos == DP[i] && V[i] < prev)
        {
            result.push_back(V[i]);
            --pos;
            prev = V[i];
        }            
    }
    
    copy(result.rbegin(), result.rend(), ostream_iterator<int>(fout, " "));
    fout << endl;
    
    return 0;
}