Advertisement
Derga

Untitled

Feb 24th, 2023
633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. std::vector<int> longest_increasing_subseq(const std::vector<int>& seq) {
  8.     int numbers_count = seq.size();
  9.     vector<int> sub;
  10.     vector<int> sub_indexes;
  11.     vector<int> trace(numbers_count, -1);
  12.     for (int i = 0; i < numbers_count; ++i) {
  13.         if (sub.empty() || sub[sub.size() - 1] < seq[i]) {
  14.             if (!sub.empty())
  15.                 trace[i] = sub_indexes[sub.size() - 1];
  16.             sub.push_back(seq[i]);
  17.             sub_indexes.push_back(i);
  18.         } else {
  19.             int idx = lower_bound(sub.begin(), sub.end(), seq[i]) - sub.begin();
  20.             if (idx > 0)
  21.                 trace[i] = sub_indexes[idx - 1];
  22.             sub[idx] = seq[i];
  23.             sub_indexes[idx] = i;
  24.         }
  25.     }
  26.  
  27.     vector<int> path;
  28.     int idx = sub_indexes[sub_indexes.size() - 1];
  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.     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