Cod sursa(job #2572870)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 5 martie 2020 14:41:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda OJI 2020 Marime 1.4 kb
#include <bits/stdc++.h>
#define pb push_back

using namespace std;

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

void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H; debug_out(T...);}
#define dbg(...) cerr << #__VA_ARGS__ << " ->", debug_out(__VA_ARGS__)
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"

typedef pair<int,int> pii;
typedef long long int ll;
typedef long double ld;

const int DMAX = 1e5+10;

vector <int> ans;

int V[DMAX];
int dp[DMAX];
int best[DMAX];

int n,cate;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t,i,j;

    fin>>n;
    for(i=1;i<=n;i++)
        fin>>V[i];

    dp[1]=V[1];
    best[1]=1;
    cate=1;
    for(i=2;i<=n;i++)
        if(V[i] > dp[cate]){
            dp[++cate]=V[i];
            best[i]=cate;
        }
        else{
            int pos=lower_bound(dp+1,dp+cate+1,V[i])-dp;
            best[i]=pos;
            dp[pos]=V[i];
        }
    fout<<cate<<'\n';
    ans.pb(2e9+1);
    for(i=n;i>0;i--)
        if(best[i] == cate && V[i] < ans[ans.size()-1]){
            ans.pb(V[i]);
            cate--;
        }
    reverse(ans.begin(),ans.end());
    ans.pop_back();
    for(auto& it:ans)
        fout<<it<<' ';
    return 0;
}