Cod sursa(job #1276339)

Utilizator cdascaluDascalu Cristian cdascalu Data 26 noiembrie 2014 11:02:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <queue>
#define Nmax 100001
using namespace std;

int solve(int v[], int pos, int max_length, priority_queue< pair<int, int> > heap[Nmax])
{
    int left = 1, right = max_length, mid, value = v[pos], sol_pos = pos;
    while(left <= right)
    {
        mid = (left + right)/2;

        if(heap[mid].empty())
        {
            right = mid - 1;
            continue;
        }

        auto it = heap[mid].top();

        if((it.first) * (-1) < value)
        {
            sol_pos = it.second;
            left = mid+1;
        } else {
            right = mid - 1;
        }
    }

    return sol_pos;
}
int main()
{
    int N, v[Nmax], best[Nmax], T[Nmax];
    priority_queue< pair<int, int> > heap[Nmax];

    ifstream f("scmax.in");
    f>>N;
    for(int i=1;i<=N;++i)
        f>>v[i];
    f.close();

    int max_length = 0, max_pos;
    for(int i=1;i<=N;++i)
    {
        int pos = solve(v, i, max_length, heap);
        if(pos == i)
        {
            best[i] = 1;
            T[i] = i;
        }
        else
        {
            best[i] = 1 + best[pos];
            T[i] = pos;
        }

        if(best[i] > max_length)
        {
            max_length = best[i];
            max_pos = i;
        }

        heap[best[i]].push(make_pair(v[i] * (-1), i));
    }

    vector<int> final;

    int i;
    for(i=max_pos; T[i] != i; i = T[i])
        final.push_back(v[i]);

    final.push_back(v[i]);

    reverse(final.begin(), final.end());
    ofstream g("scmax.out");
    g<<max_length<<"\n";
    for(auto it = final.begin(); it != final.end(); ++it)
        g<<*it<<" ";
    g.close();
    return 0;
}