Nu aveti permisiuni pentru a descarca fisierul grader_test19.in
Cod sursa(job #3163706)
Utilizator | Data | 31 octombrie 2023 22:35:22 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;
int binsearch(int arr[], int L, int R, int x){
int l = L, h = R;
while (l != h){
int m = (l + h) / 2;
if (x <= arr[m]){
h = m;
} else {
l = m + 1;
}
}
return l;
}
int main(){
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int N;
cin >> N;
int A[N + 1];
for(int i = 0; i < N; i++){
cin >> A[i];
}
const int inf = std::numeric_limits<int>::max();
int n, m, l;
int M[N + 10];
int K[N + 10];
int B[N + 10];
A[N] = inf;
n = m = l = 0;
M[0] = A[0];
for (int i = 1; i < N; i++)
M[i] = inf;
for (int i = 0; i <= N; i++)
B[i] = inf;
while (n != N){
m = max(m, l + 1);
K[n] = l + 1;
l = binsearch(M, 0, m + 1, A[n + 1]);
M[l] = min(M[l], A[n + 1]);
n = n + 1;
}
l = m;
n = N - 1;
while (l != 0){
if (K[n] == l && A[n] < B[l]){
B[l - 1] = A[n];
l = l - 1;
n = n - 1;
} else {
n = n - 1;
}
}
cout << m << '\n';
for (int i = 0; i < m; i++)
cout << B[i] << '\n';
return 0;
}