Cod sursa(job #2964543)

Utilizator tibinyteCozma Tiberiu-Stefan tibinyte Data 13 ianuarie 2023 10:18:50
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

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

int32_t main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 5;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i)
    {
        a[i] = i;
    }
    vector<int> dp(n + 1, INT_MAX);
    vector<int> unde(n + 1);
    map<int, int> last;
    dp[0] = 0;
    int ans = 0;
    int qui = 0;
    for (int i = 1; i <= n; ++i)
    {
        int st = 0, dr = i - 1;
        int rep = 0;
        while (st <= dr)
        {
            int mid = (st + dr) / 2;
            if (dp[mid] < a[i])
            {
                rep = mid;
                st = mid + 1;
            }
            else
            {
                dr = mid - 1;
            }
        }
        dp[rep + 1] = min(dp[rep + 1], a[i]);
        unde[i] = last[dp[rep]];
        if (rep + 1 > ans)
        {
            ans = rep + 1;
            qui = i;
        }
        last[a[i]] = i;
    }
    fout << ans << '\n';
    vector<int> rep;
    while (qui)
    {
        rep.push_back(qui);
        qui = unde[qui];
    }
    assert((int)rep.size() == ans);
    for (int i = 1; i < ans; ++i)
    {
        assert(a[rep[i]] > a[rep[i - 1]]);
    }
    reverse(rep.begin(), rep.end());
    for (auto i : rep)
    {
        fout << i << ' ';
    }
}