Cod sursa(job #2802322)

Utilizator etienAndrone Stefan etien Data 17 noiembrie 2021 21:54:15
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int aib[100001];
int val[100001],v[100001],best[100001];
int n;
pair<int,pair<int,int>>p[100001];
vector<int>sol;
vector<int>vv[100001];
stack<int>st;
bool cmp(pair<int,pair<int,int>>a,pair<int,pair<int,int>>b)
{
    return a.second.second<b.second.second;
}
void norm(int v[],int n)
{
    for(int i=1;i<=n;i++)
        p[i].first=v[i];
    for(int i=1;i<=n;i++)
        p[i].second.second=i;
    sort(p+1,p+n+1);
    int nr=0;
    for(int 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(int i=1;i<=n;i++)
    {
        val[p[i].second.first]=p[i].first;
        v[i]=p[i].second.first;
    }
}
void update(int val,int poz)
{
    if(poz==0)
        return;
    while(poz<=n)
    {
        aib[poz]=max(aib[poz],val);
        poz+=(poz&(-poz));
    }
}
int query(int poz)
{
    int maxi=0;
    while(poz>0)
    {
        maxi=max(maxi,aib[poz]);
        poz-=(poz&(-poz));
    }
    return maxi;
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    norm(v,n);
    for(int 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(int i=1;i<=n;i++)
        if(best[v[i]]!=0)
            vv[best[v[i]]].push_back(v[i]);
    int 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(int 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())
    {
        sol.push_back(val[st.top()]);
        st.pop();
    }
    for(auto q:sol)
        fout<<q<<" ";
}