Cod sursa(job #2003225)

Utilizator richieYRichie Yeung richieY Data 22 iulie 2017 12:25:51
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

constexpr int INF = 123456789;

bool rev(int a, int b) {
    return a > b;
}

int main() {
    int n;
    fin >> n;
    vector<pair<int, int>> srtd(n);
    vector<pair<int, int>> seq(n);
    
    for (int i = 0; i < n; i += 1) {
        int x;
        fin >> x;
        srtd[i] = make_pair(x, i);
    }
    sort(srtd.begin(), srtd.end());
    
    for (int i = 0; i < n; i += 1) {
        pair<int, int> pr = srtd[i];
        seq[pr.second] = make_pair(pr.first, i);
    }
    
    
    vector<int> best(n+1, INF);
    vector<vector<int>> solutions(n+1, vector<int>(0));
    int ans = 0;
    best[0] = -1;
    for (int i = 0; i < n; i++) {
        pair<int, int> x = seq[i];
        int val = x.first;
        int srtdPos = x.second;
        
        int len = (upper_bound(best.begin(), best.end(), srtdPos)-best.begin());
        if (srtd[best[len-1]].first != val) {
            if (best[len] == INF) {
                ans = len;
            }
            
            best[len] = min(srtdPos, best[len]);
            solutions[len].push_back(srtdPos);
        }
    }
    
    fout << ans << '\n';
    
    // constructing the solution
    vector<int> sequence(ans);
    int pos = solutions[ans].back();
    for (int i = ans; i > 0; i -= 1) {
        int x = lower_bound(solutions[i].begin(), solutions[i].end(), pos, rev) - solutions[i].begin();
        pos = solutions[i][x];
        sequence[i-1] = srtd[pos].first;
    }
    
    for (auto x : sequence) {
        fout << x << " ";
    }
    fout << endl;
    
    return 0;
}