Untitled

 avatar
unknown
plain_text
13 days ago
3.4 kB
4
Indexable
#include <bits/stdc++.h>

using namespace std;

#define Chris "test"
#define FOR(i, a, b) for(int i = (a); i < (b); ++i)
#define FORD(i, a, b) for(int i = (a); i <= (b); ++i)
#define REP(i, a, b) for(int i = (a); i > (b); --i)
#define REPD(i, a, b) for(int i = (a); i >= (b); --i)
#define FORE(i, v) for(__typeof((v).begin()) i = (v).begin(); i != (v).end(); i++)
#define All(v) (v).begin(), (v).end()
#define rAll(v) (v).rbegin(), (v).rend()
#define MARK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define fi first
#define se second
#define el "\n"
#define Chris_ signed main()
#define faster ios_base::sync_with_stdio(false); cin.tie(nullptr);
#define file(Chris) if(fopen(Chris".inp", "r")){freopen(Chris".inp", "r", stdin);freopen(Chris".out", "w", stdout);}

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vii;
typedef set<int> sii;
typedef map<int, int> mii;
typedef stack<int> sti;
typedef deque<int> dqi;
typedef queue<int> quei;
typedef unordered_map<int, int> umii;

const int mod = (int) 1e5;
const int INF = (int) 1e9;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

int n;

void solve(int n)
{
    vii a(n);
    FOR(i, 0, n) cin >> a[i];
    vii l(n, 1);
    FOR(i, 0, n)
    {
        FOR(j, 0, i)
        {
            if(a[i] > a[j])
            {
                l[i] = max(l[i], l[j] + 1);
            }
        }
    }
    cout <<*max_element(All(l)) << el;
}

void solve1(int n)
{
    vii a(n), kq;
    FOR(i, 0, n)
    {
        auto it = lower_bound(All(kq), a[i]);
        if(it == kq.end()) kq.pb(a[i]);
        else *it = a[i];
    }
    cout << kq.size() << el;
}

vii getlis(vii &a)
{
    int n = a.size();
    vii dp(n, 1), seq(n);
    FOR(i, 0, n)
    {
        seq[i] = i;
        FOR(pre, 0, i)
        {
            if(a[pre] < a[i] && dp[pre] + 1 > dp[i])
            {
                dp[i] = 1 + dp[pre];
                seq[i] = pre;
            }
        }
    }
    int ans = -1, tmp = -1;
    FOR(i, 0, n)
    {
        if(dp[i] > ans)
        {
            ans = dp[i];
            tmp = i;
        }
    }
    vii res;
    res.pb(a[tmp]);
    while(seq[tmp] != tmp)
    {
        tmp = seq[tmp];
        res.pb(a[tmp]);
    }
    reverse(All(res));
    return res;
}

vii printLIS(const vii &a)
{
    int n = a.size();
    vii tail, indi(n), pre(n, -1);
    FOR(i, 0, n)
    {
        auto it = lower_bound(All(tail), a[i]);
        int pos = it - tail.begin();
        if(pos == tail.size())
        {
            tail.pb(a[i]);
        }
        else
        {
            tail[pos] = a[i];
        }
        indi[pos] = i;
        if(pos > 0)
        {
            pre[i] = indi[pos - 1];
        }
    }
    vii lis;
    for(int i = indi[tail.size() - 1]; i >= 0; i = pre[i])
    {
        lis.pb(a[i]);
    }
    reverse(All(lis));
    return lis;
}

Chris_
{
    faster
    file(Chris)

    cin >> n;
    vii a(n), kq;
    FOR(i, 0, n) cin >> a[i];
    vii kq1 = printLIS(a);
    cout << kq1.size() << el;
    for(int i : kq1)
    {
        cout << i << " ";
    }
    return 0;
}
Leave a Comment