Pagini recente » Cod sursa (job #1442050) | Cod sursa (job #2587208) | Cod sursa (job #814016) | Cod sursa (job #1091237) | Cod sursa (job #2700804)
#include <fstream>
#include <vector>
using namespace std;
int search_insertion_pos
(
vector<int> & longest_inc_subseq,
int longest_inc_subseq_len,
int val
) {
int left = 0;
int right = longest_inc_subseq_len - 1;
int insertion_pos = 0;
while (left <= right) {
insertion_pos = left + (right - left) / 2;
if (longest_inc_subseq[insertion_pos] == val) {
break;
} else if (val < longest_inc_subseq[insertion_pos]) {
right = insertion_pos - 1;
} else {
left = insertion_pos + 1;
insertion_pos = left;
}
}
return insertion_pos;
}
int main() {
int N;
ifstream fin("scmax.in");
fin >> N;
vector<int> a(N);
for (int i = 0; i < N; i++) {
fin >> a[i];
}
fin.close();
vector<int> longest_inc_subseq(N, -1);
longest_inc_subseq[0] = a[0];
int longest_inc_subseq_len = 1;
for (int i = 1; i < N; i++) {
int insertion_pos = search_insertion_pos(
longest_inc_subseq,
longest_inc_subseq_len,
a[i]
);
longest_inc_subseq[insertion_pos] = a[i];
if (insertion_pos == longest_inc_subseq_len) {
longest_inc_subseq_len++;
}
}
ofstream fout("scmax.out");
fout << longest_inc_subseq_len << endl;
for (int i = 0; i < longest_inc_subseq_len; i++) {
fout << longest_inc_subseq[i] << " ";
}
fout.close();
return 0;
}