Cod sursa(job #1182014)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 4 mai 2014 15:00:23
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
#include <iterator>
using namespace std;
const int MAXN = 100001;
map<int, int> m;
vector<int> v, LIS;
int parent[MAXN];

void read()
{
    ifstream fin("scmax.in");
    int n, x;
    fin>>n;
    for (int i=0; i<n; ++i)
    {
        fin>>x;
        v.push_back(x);
    }
}
void solve()
{
    for (int i=0; i<v.size(); ++i)
    {
        map<int,int>::iterator it, pred, succ;
        it = m.find(v[i]);

        if (it != m.end())
            continue;
        m.insert(make_pair(v[i], i));

        it = m.find(v[i]);

        //GASESTE PREDECESORUL SI SUCCESORUL O(map.size())
        pred = prev(it);
        succ = next(it);

        //ELIMINAM CANDIDATUL MAI PROST
        if (succ != m.end())
            m.erase(succ);

        //DACA E SINGUR IN LISTA PARINTELE E -1
        if (m.size() == 1)
            parent[it->second] = -1;
        else
            parent[it->second] = pred->second;
    }
    //CONSTRUIESTE LISTA: ULTIMUL EL DIN MAP
    //O SA FIE SFARSITUL LIS-ULUI
    int p = m.rbegin()->second;
    while (p!=-1)
    {
        LIS.push_back(p);
        p = parent[p];
    }
}

void write()
{
    ofstream fout("scmax.out");
    fout<<LIS.size()<<'\n';
    for (int i=LIS.size()-1; i>=0; --i)
        fout<<v[LIS[i]]<<' ';
    fout<<'\n';
}
int main()
{
    read();
    solve();
    write();
    return 0;
}