Cod sursa(job #2285398)

Utilizator TooHappyMarchitan Teodor TooHappy Data 18 noiembrie 2018 15:52:48
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream in("scmax.in");
ofstream out("scmax.out");

void showSequence(int i, const vector< int > &result, const vector< int > &v) {
    if(result[i] == -1) {
        out << v[i] << " ";
        return;
    }

    showSequence(result[i], result, v);
    out << v[i] << " ";
}

int ceilIndexBinarySearch(const vector< int > &v, const vector< int > &temp, const int &len, const int &target) {
    int lo = 0;
    int hi = len;

    while(lo <= hi) {
        int mid = (lo + hi) / 2;

        if(mid < len && v[temp[mid]] < target && target <= v[temp[mid + 1]]) {
            return mid + 1;
        }

        if(v[temp[mid]] < target) {
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    return len + 1;
}

void longestIncreasingSubsequence(const vector< int > &v, const int &n) {
    vector< int > temp(n), result(n, -1);

    int len = 0;
    temp[0] = 0;

    for(int i = 1; i < n; ++i) {
        if(v[i] < v[temp[0]]) {
            temp[0] = i;
            continue;
        }

        if(v[i] > v[temp[len]]) {
            ++len;
            temp[len] = i;
            result[temp[len]] = temp[len - 1];
            continue;
        }

        int idx = ceilIndexBinarySearch(v, temp, len, v[i]);
        temp[idx] = i;
        result[temp[idx]] = temp[idx - 1];
    }

    out << len + 1 << "\n";
    showSequence(temp[len], result, v);
}

int main() {
    ios::sync_with_stdio(false); in.tie(0); out.tie(0);
    
    int n; in >> n;

    vector< int > v(n);
    for(auto &it: v) in >> it;

    longestIncreasingSubsequence(v, n);

    in.close(); out.close();
 
    return 0;
}