Cod sursa(job #1724818)

Utilizator SaitamaSaitama-san Saitama Data 4 iulie 2016 12:50:43
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

using namespace std;

struct el
{
    int poz, val;
    bool operator<(const el&A)const
    {
        return val < A.val;
    }
};

int a[100005], dp[100005], n, aib[100005], rez[100005], vect[100005];
el v[100005];

inline void Read()
{
    ifstream fin("scmax.in");
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> a[i], vect[i] = a[i];
    fin.close();
}

inline void Normalizare()
{
    int i;
    for(i = 1; i <= n; i++)
    {
        v[i].val = a[i];
        v[i].poz = i;
    }
    sort(v + 1, v + 1 + n);
    a[v[1].poz] = 1;
    for(i = 2; i <= n; i++)
    {
        a[v[i].poz] = a[v[i - 1].poz];
        if(v[i].val > v[i - 1].val)
            ++a[v[i].poz];
    }
}

inline void Update(int poz, int val)
{
    int i;
    for(i = poz; i <= n; i += (i & (-i)))
        if(val > aib[i])
            aib[i] = val;
}

int Query(int poz)
{
    int i, sol;
    sol = 0;
    for(i = poz; i >= 1; i -= (i & (-i)))
        if(aib[i] > sol)
            sol = aib[i];
    return sol;
}

inline void Solve()
{
    int i, sol, lg, last, cnt, k;
    for(i = 1; i <= n; i++)
    {
        dp[i] = 1 + Query(a[i] - 1);
        Update(a[i], dp[i]);
    }
    sol = 0;
    k = 0;
    for(i = 1; i <= n; i++)
        if(dp[i] > sol)
            sol = dp[i], k = i;
    lg = dp[k];
    last = vect[k];
    cnt = 0;
    rez[++cnt] = last;
    for(i = k; i >= 1; i--)
    {
        if(dp[i] == lg - 1 && vect[i] < last)
        {
            lg--;
            last = vect[i];
            rez[++cnt] = last;
        }
    }
    ofstream fout("scmax.out");
    fout << sol << "\n";
    for(i = cnt; i >= 1; i--)
        fout << rez[i] << " ";
    fout << "\n";
    fout.close();
}

int main()
{
    Read();
    Normalizare();
    Solve();
    return 0;
}