Cod sursa(job #2167264)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 13 martie 2018 20:51:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream h("scmax.in");
ofstream g("scmax.out");

vector<int> a, b; //a vectorul cu valori initiale, b vector de indici pentru cele mai mari subsiruri la un moment dat

int t[100020], n; //t retine indici ai valorilor care sunt inainte de i (t[i] = k inseamna ca dupa valoarea din indicele k urmeaza valoarea cu indicele i din a)

void cmlsc(vector<int> &a, vector<int> &b){

int c=0, f=0, l=0;

b.push_back(0); //adaugam indicele primei valori din a
t[0]=0;

for(int i=1; i<a.size(); i++){

    if(a[i]>a[b.back()]){ // daca valoarea urmatoare (a[i] unde i pleaca de pe 1 nu de pe 0) este mai mare ca ultima valoare cu indicele din b.back() o adaug in b si o marchez in t

        t[i]=b.back();
        b.push_back(i);


    }

    for(f=0, l=b.size()-1; f<l;){       //daca prima conditie nu e indeplinita inseamna ca numarul meu este undeva intre 2 valori deci caut binar cea mai mica valoare mai mare a a[i]

        c=(f+l)/2;
        if(a[i]>a[b[c]])f=c+1; else l=c;

    }
    if(a[i]<a[b[l]]){   //daca mi-a gasit o valoare inlocuieste valoarea respectiva cu cea de la momentul i si marcheaza in t dupa ce valoare urmeaza

        b[l]=i;
       if(l>0) t[i]=b[l-1];

    }

}

for(l=b.size(), f=b.back(); l--; f=t[f])b[l]=f; //parcurge vectorul t in sens invers punand in b indicii valorilor care fac parte din cel mai mare subsir crescator

}

int main()
{

h>>n;

for(int i=1; i<=n; i++){

    int x;
    h>>x;
    a.push_back(x);

}

cmlsc(a, b);

g<<b.size()<<"\n";
for(int i=0; i<b.size(); i++)g<<a[b[i]]<<" ";

    return 0;
}