Cod sursa(job #1891996)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 24 februarie 2017 16:04:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>

using namespace std;

class SCMaxSolver{
public:
    void run(){
        prev.resize(v.size());
        location.clear();
        best.clear();

        for (int i = 0; i < v.size(); ++i){
            int pos = binary_search(v[i]);
            if (pos >= best.size()){
                best.push_back(v[i]);
                location.push_back(i);
            }
            else{
                best[pos] = v[i];
                location[pos] = i;
            }

            if (pos){
                prev[i] = location[pos - 1];
            }
            else{
                prev[i] = -1;
            }
        }
    }

    int binary_search(int x){
        int left = 0;
        int right = best.size() - 1;

        while (left <= right){
            int mid = (left + right) / 2;
            if (x <= best[mid]){
                right = mid - 1;
            }
            else{
                left = mid + 1;
            }
        }
        return left;
    }

    void print_result(ostream& out){
        stack<int> result;
        int current = location.back();

        while (current != -1){
            result.push(v[current]);
            current = prev[current];
        }

        out << result.size() << '\n';
        while (!result.empty()){
            out << result.top() << ' ';
            result.pop();
        }
    }

    void read(istream& in){
        int n;
        in >> n;

        v.resize((unsigned int) n);
        for (int i = 0; i < n; ++i){
            in >> v[i];
        }
    }

private:
    vector<int> v;

    vector<int> prev;
    vector<int> location;
    vector<int> best;
};
int main() {

    ifstream cin("scmax.in");
    ofstream cout("scmax.out");

    SCMaxSolver solver;
    solver.read(cin);
    solver.run();
    solver.print_result(cout);

    return 0;
}