Cod sursa(job #2802325)

Utilizator etienAndrone Stefan etien Data 17 noiembrie 2021 22:06:19
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
long long aib[100001];
long long val[100001],v[100001],best[100001];
long long n;
pair<long long,pair<long long,long long>>p[100001];
vector<long long>vv[100001];
stack<long long>st;
bool cmp(pair<long long,pair<long long,long long>>a,pair<long long,pair<long long,long long>>b)
{
    return a.second.second<b.second.second;
}
void norm(long long v[],long long n)
{
    for(long long i=1;i<=n;i++)
        p[i].first=v[i];
    for(long long i=1;i<=n;i++)
        p[i].second.second=i;
    sort(p+1,p+n+1);
    long long nr=0;
    for(long long i=1;i<=n;i++)
        if(p[i].first!=p[i-1].first)
            p[i].second.first=++nr;
        else p[i].second.first=nr;
    sort(p+1,p+n+1,cmp);
    for(long long i=1;i<=n;i++)
    {
        val[p[i].second.first]=p[i].first;
        v[i]=p[i].second.first;
    }
}
void update(long long val,long long poz)
{
    if(poz==0)
        return;
    while(poz<=n)
    {
        aib[poz]=max(aib[poz],val);
        poz+=(poz&(-poz));
    }
}
long long query(long long poz)
{
    long long maxi=0;
    while(poz>0)
    {
        maxi=max(maxi,aib[poz]);
        poz-=(poz&(-poz));
    }
    return maxi;
}
int main()
{
    fin>>n;
    for(long long i=1;i<=n;i++)
        fin>>v[i];
    norm(v,n);
    for(long long i=1;i<=n;i++)
    {
        best[v[i]]+=max(0,query(v[i]-1)+1-best[v[i]]);
        update(best[v[i]],v[i]);
    }
    for(long long i=1;i<=n;i++)
        if(best[v[i]]!=0)
            vv[best[v[i]]].push_back(v[i]);
    long long i;
    for(i=1;vv[i].size()>0;i++);
    i--;
    sort(vv[i].begin(),vv[i].end());
    st.push(vv[i][vv[i].size()-1]);
    i--;
    while(i>0)
    {
        for(long long p=0;p<vv[i].size();p++)
            if(vv[i][p]<st.top()&&val[vv[i][p]]<val[st.top()])
            {
                st.push(vv[i][p]);
                break;
            }
        i--;
        //cout<<i<<" ";
    }
    fout<<st.size()<<"\n";
    while(!st.empty())
    {
        fout<<val[st.top()]<<" ";
        st.pop();
    }
}