Pagini recente » Cod sursa (job #855553) | Cod sursa (job #642571) | Cod sursa (job #1366593) | Cod sursa (job #1364709) | Cod sursa (job #2700802)
#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;
if (val > longest_inc_subseq[right]) {
return right + 1;
}
while (left <= right) {
int mid = left + (right - left) / 2;
if (
((mid > 0 && val > longest_inc_subseq[mid - 1]) ||
(mid == 0)) &&
val <= longest_inc_subseq[mid]
) {
return mid;
} else if (mid > 0 && val <= longest_inc_subseq[mid - 1]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
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;
}