Cod sursa(job #3003731)

Utilizator DooMeDCristian Alexutan DooMeD Data 15 martie 2023 21:35:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int inf = 2e9 + 5;

int v[nmax+5];
int dp[nmax+5];
int len[nmax+5];
int prv[nmax+5];
int pos[nmax+5];
// dp[i] - elementul minim cu care se termina un subsir de lungimea i

// dp - crescator

// dp: 1  2  3  4  5
//     3  6  10 15 20 

// 13

int main() {
    ifstream f("scmax.in");
    ofstream g("scmax.out");

    int n; f >> n;
    for(int i=1; i<=n; i++) dp[i] = inf;

    int mx = 0, ret;
    for(int i=1; i<=n; i++) {
        f >> v[i];
        int st = 1;
        int dr = n;
        int ans = 0;
        while(st <= dr) {
            int mid = (st + dr) / 2;
            if(dp[mid] < v[i]) {
                ans = mid;
                st = mid + 1;
            }
            else 
                dr = mid-1;
        }
        len[i] = ans + 1;
        dp[ans+1] = v[i];
        pos[ans+1] = i;
        prv[i] = pos[ans];
        if(len[i] > mx) {
            mx = len[i];
            ret = i;
        }
    }

    g << mx << "\n";
    vector<int> sol;
    for(int i=1; i<=mx; i++) {
        sol.emplace_back(v[ret]);
        ret = prv[ret];
    }
    reverse(sol.begin(), sol.end());
    for(auto i : sol) g << i << " ";
    return 0;
}