Mai intai trebuie sa te autentifici.
Cod sursa(job #762035)
| Utilizator | Data | 28 iunie 2012 13:53:12 | |
|---|---|---|---|
| Problema | Subsir crescator maximal | Scor | 65 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.12 kb |
#include <fstream>
#include <algorithm>
using namespace std;
long N;
long A[100005];
long L;
long ValBest[100005];
long IndexBest[100005];
long IndexParinte[100005];
long Result[100005];
long GetBestParinte(long i)
{
return (lower_bound(ValBest,ValBest + L,A[i]) - ValBest);
}
int main(void)
{
fstream fin("scmax.in",ios::in);
fstream fout("scmax.out",ios::out);
long i,k;
fin >> N;
for (i = 1;i <= N;i += 1)
{
fin >> A[i];
}
L = 2;
ValBest[1] = A[1];
IndexBest[1] = 1;
IndexParinte[1] = 0;
for (i = 2;i <= N;i += 1)
{
k = GetBestParinte(i);
if (k == L)
{
ValBest[L] = A[i];
IndexBest[L] = i;
IndexParinte[i] = IndexBest[L - 1];
L += 1;
}
else
{
if (ValBest[k] > A[i])
{
ValBest[k] = A[i];
IndexBest[k] = i;
IndexParinte[i] = IndexParinte[k];
}
}
}
for (i = L - 1;i >= 0;i -= 1)
{
Result[i] = A[IndexBest[i]];
}
fout << (L - 1) << "\n";
for (i = 1;i < L;i += 1)
{
fout << Result[i] << " ";
}
fin.close();
fout.close();
return 0;
}
