Cod sursa(job #1925228)

Utilizator alex.stancuAlex Stancu alex.stancu Data 12 martie 2017 17:48:36
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>


using namespace std;

struct ans {
    vector<int> seq;
    int len;
};

int ceil_binary_search(vector<int> &v, int l, int r, int key) {
    while(r - l > 1) {
        int m = l + (r - l) / 2;
        if(v[m] >= key) {
            r = m;
        } else {
            l = m;
        }
    }
    
    return r;
}

ans longest_increasing_seq(vector<int> &v) {
    vector<int> tail(v.size(), 0);
    int length = 1;
    tail[0] = v[0];
    
    for(int i = 1; i < v.size(); i++) {
        if(v[i] < tail[0]) {
            tail[0] = v[i];
        } else if(v[i] > tail[length - 1]) {
            tail[length++] = v[i];
        } else {
            tail[ceil_binary_search(tail, -1, length - 1, v[i])] = v[i];
        }
    }
    
    ans answer;
    answer.seq = tail;
    answer.len = length;
    
    return answer;
}

int main() {

    ifstream f("scmax.in");
    ofstream g("scmax.out");
    vector<int> v;
    int n, x;
    f >> n;
    for(int i = 0; i < n; i++) {
        f >> x;
        v.push_back(x);
    }
    ans answer = longest_increasing_seq(v);
    
    g << answer.len << endl;
    
    for(int i = 0; i < answer.len; i++) {
        g << answer.seq[i] << " ";
    }
    
   return 0;
}