Cod sursa(job #1655705)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 18 martie 2016 11:18:56
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

vector<int> a, previous, BST;
int N, ans, bMax;

void read();
void solve();
int binarySearch(int st, int dr, int val);
void write();
void buildSolution(int last);

int main()
{
    read();
    solve();
    write();
    return 0;
}
void buildSolution(int last)
{
    if(last > 0)
    {
        buildSolution(previous[last]);
        cout<<last<<' ';
    }
}
void write()
{
    cout<<BST.size()-1<<'\n';
    buildSolution(BST.back());
    cout<<'\n';
}
void solve()
{
    for(int i=2; i<=N; ++i)
        if(a[i] > a[BST.back()]) {                              //elementul a[i] poate fi pus la capatul celui mai lung subsir
            previous[i] = BST[BST.size() - 1];
            BST.push_back(i);
        }
        else {
            bMax = binarySearch(0, BST.size()-1, a[i]);
            BST[bMax + 1] = i;
            previous[i] = BST[bMax];
        }
}
int binarySearch(int st, int dr, int val)
{
    int mij;
    while(st <= dr) {
        mij = (dr-st)/2 + st;
        if(val > a[BST[mij]]) {
            st = mij+1;
            bMax = mij;
        }
        else
            dr = mij-1;
    }
    return bMax;
}

void read()
{
    freopen("scmax.in", "rt", stdin);
    freopen("scmax.out", "wt", stdout);
    scanf("%d", &N);
    a.assign(N+2, 0);
    BST.assign(2, 0);
    previous.assign(N+2, -1);
    for(int i=1; i<=N; ++i)
        scanf("%d", &a[i]);
    BST[1] = 1;
}