Pagini recente » Statistici Albu Andreea-Cristiana (andreeacristiana) | Cod sursa (job #1435294) | Cod sursa (job #1875003) | Rating Mihalcea Cosmin-George (Earthequak3) | Cod sursa (job #1175987)
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
#define in "scmax.in"
#define out "scmax.out"
#define MAXN 100001
int n, arr[MAXN], parent[MAXN], min_tail[MAXN], max_inc_len, sol[MAXN], maxi;
void read_input()
{
ifstream fin(in);
if (fin.is_open())
{
fin >> n;
for (int i = 1; i <= n; ++i)
{
fin >> arr[i];
//cout << arr[i] << ' ';
}
fin.close();
}
}
int binary_search(int left, int right, int val)
{
if (left == right)
return left;
int center = (left + right) / 2;
if (val <= min_tail[center])
{
return binary_search(left, center, val);
}
else
{
return binary_search(center + 1, right, val);
}
}
void resolve()
{
int pi;
for (int i = 1; i <= n; ++i)
{
if (arr[i] > min_tail[max_inc_len])
{
max_inc_len++;
min_tail[max_inc_len] = arr[i];
sol[max_inc_len] = arr[i];
parent[max_inc_len] = min_tail[max_inc_len - 1];
}
else
{
pi = binary_search(1, max_inc_len, arr[i]);
min_tail[pi] = arr[i];
parent[pi + 1] = arr[i];
}
//cout << '\n';
//for (int j = 1; j <= max_inc_len; j++)
//{
// cout << min_tail[j] << ' ';
//}
}
}
void print_debug()
{
cout << '\n';
}
void print_solution()
{
ofstream fout(out);
fout << max_inc_len << '\n';
int k;
sol[max_inc_len] = min_tail[max_inc_len];
for (k = max_inc_len; k > 0; k--)
{
sol[k - 1] = parent[k];
}
for (int i = 1; i <= max_inc_len; ++i)
{
fout << sol[i] << ' ';
}
}
int main()
{
read_input();
resolve();
//print_debug();
print_solution();
//char x;
//cin >> x;
return 0;
}