Advertisement
Derga

Untitled

Feb 26th, 2023
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. std::vector<int> longest_increasing_subseq(const std::vector<int>& seq) {
  6.   int numbers_count = seq.size();
  7.   std::vector<int> subseq;
  8.   std::vector<int> subseq_indexes;
  9.   std::vector<int> trace(numbers_count, -1);
  10.   for (int i = 0; i < numbers_count; ++i) {
  11.     if (subseq.empty() || subseq.back() < seq[i]) {
  12.       if (!subseq.empty()) {
  13.           trace[i] = subseq_indexes.back();
  14.       }
  15.       subseq.push_back(seq[i]);
  16.       subseq_indexes.push_back(i);
  17.     } else {
  18.       int idx = lower_bound(subseq.begin(), subseq.end(), seq[i]) - subseq.begin();
  19.       if (idx > 0) {
  20.         trace[i] = subseq_indexes[idx - 1];
  21.       }
  22.       subseq[idx] = seq[i];
  23.       subseq_indexes[idx] = i;
  24.     }
  25.   }
  26.  
  27.   std::vector<int> path;
  28.   int idx = subseq_indexes.back();
  29.  
  30.   while (idx != -1) {
  31.     path.push_back(seq[idx]);
  32.     idx = trace[idx];
  33.   }
  34.   reverse(path.begin(), path.end());
  35.   return path;
  36. }
  37.  
  38. int main() {
  39.   std::ios_base::sync_with_stdio(false);
  40.   std::cin.tie(nullptr);
  41.  
  42.   std::size_t n;
  43.   std::cin >> n;
  44.   std::vector<int> seq(n);
  45.  
  46.   for (auto& el : seq) {
  47.       std::cin >> el;
  48.   }
  49.  
  50.   auto longest_seq = longest_increasing_subseq(seq);
  51.  
  52.   std::cout << longest_seq.size() << "\n";
  53.   for (auto el : longest_seq) {
  54.       std::cout << el << " ";
  55.   }
  56.  
  57.   return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement