Cod sursa(job #2365083)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 4 martie 2019 11:59:51
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include<bits/stdc++.h>

using namespace std;
#define NMAX 131072
#define INF 0x3f3f3f3f
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> val;
int dp[NMAX],pre[NMAX];
vector<pair<int,int> > sorted;
int n,N;
int arb[4*NMAX];

bool cmp(const pair<int,int> &lhs,const pair<int,int> &rhs)
{
    if(lhs.first==rhs.first)
        return lhs.second>rhs.second;
    return lhs.first<rhs.first;
}

void initialize()
{
    for(int i=N;i<2*N;i++)
        arb[i]=i-N;
}

void add(int poz,int x)
{
    dp[poz]=x;
    poz+=N;
    for(poz/=2;poz>=1;poz/=2)
    {
        if(dp[arb[2*poz+1]]>dp[arb[2*poz]])
            arb[poz]=arb[2*poz+1];
        else arb[poz]=arb[2*poz];
    }
}

int query(int a,int b,int k,int x,int y)
{
    if(y<a||b<x) return N;
    if(a<=x&&y<=b) return arb[k];
    int d=(x+y)/2;
    int q1=query(a,b,2*k,x,d);
    int q2=query(a,b,2*k+1,d+1,y);
    if(dp[q1]>dp[q2]) return q1;
    else return q2;
}

void afisare()
{
    int pow=1;
    for(int i=1;i<2*N;i++)
    {
        fout<<arb[i]<<" ";
        if(i==(1<<pow)-1)
        {
            pow++; 
            fout<<'\n';
        }
    }
}

int main()
{
    fin>>n;
    N=n;
    while((N&(N-1))!=0)
        ++N;
    for(int i=0;i<n;i++)
    {
        val.push_back(int());
        fin>>val[i];
        sorted.push_back({val[i],i});
    }
    dp[N]=0;
    sort(sorted.begin(),sorted.end(),cmp);
    initialize();

    for(auto x:sorted)
    {
        int index=x.second;
        int maxI=query(0,index-1,1,0,N-1);
        pre[index]=maxI;
        add(index,dp[maxI]+1);
//        afisare();
    }
    vector<int> ans;
    int maxI=n;
    for(int i=0;i<n;i++)
        if(dp[i]>dp[maxI]) maxI=i;
    while(maxI!=N)
    {
        ans.push_back(val[maxI]);
        maxI=pre[maxI];
    }
    fout<<ans.size()<<'\n';
    for(auto it=ans.rbegin();it!=ans.rend();++it)
        fout<<*it<<' ';
    return 0;
}