Advertisement
Okorosso

!ТОЧНО РАБОТАЕТ E4: Наибольшая возрастающая подпоследовательность

Jul 3rd, 2021
1,759
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <climits>
  7.  
  8. using namespace std;
  9.  
  10. vector<int> a;
  11.  
  12. bool argSortLess(int x, int y) {
  13.     return a[x] < a[y];
  14. }
  15.  
  16. void update(int indx, vector<int> &p) {
  17.     if (indx == 0)
  18.         return;
  19.     int parent = (indx - 1) / 2;
  20.     p[parent] = p[2 * parent + 1] > p[2 * parent + 2] ? p[2 * parent + 1] : p[2 * parent + 2];
  21.     update(parent, p);
  22. }
  23.  
  24. int getMax(int node, int l, int r, int tl, int tr, vector<int> &p) {
  25.     if (l > r)
  26.         return -1;
  27.     if (l == r) {
  28.         return p[l];
  29.     }
  30.     if (l == tl && r == tr) {
  31.         return p[node];
  32.     }
  33.     int tm = (tl + tr) / 2;
  34.  
  35.     int m1 = getMax(2 * node + 1, l, min(tm, r), tl, tm, p);
  36.     int m2 = getMax(2 * node + 2, max(tm + 1, l), r, tm + 1, tr, p);
  37.     if (m1 > m2) {
  38.         return m1;
  39.     } else {
  40.         return m2;
  41.     }
  42. }
  43.  
  44. int main() {
  45.     ifstream fin("input.txt");
  46.     int n;
  47.     fin >> n;
  48.     a.resize(n + 1);
  49.     vector<int> argSorted(n + 1);
  50.     vector<int> sortedByVal(n + 1);
  51.  
  52.     a[0] = INT_MIN;
  53.     for (int i = 1; i <= n; i++) {
  54.         fin >> a[i];
  55.         argSorted[i] = i;
  56.     }
  57.  
  58.     sort(argSorted.begin(), argSorted.end(), argSortLess);
  59.  
  60.     int lastIndx = 0, last = -1;
  61.     for (int i = 0; i <= n; i++) {
  62.         if (a[argSorted[i]] != last)
  63.             lastIndx = i;
  64.         sortedByVal[argSorted[i]] = lastIndx;
  65.         last = a[argSorted[i]];
  66.     }
  67.  
  68.     int newN = 1 << (int) ceil(log2(n + 1));
  69.     vector<int> results(n + 1);
  70.     vector<int> p(newN * 2 - 1, -1);
  71.     p[newN - 1 + sortedByVal[0]] = 0;
  72.     update(newN - 1 + sortedByVal[0], p);
  73.  
  74.     for (int i = 1; i <= n; i++) {
  75.         p[newN - 1 + sortedByVal[i]] = (
  76.                 getMax(0, newN - 1, newN - 2 + sortedByVal[i], newN - 1, newN * 2 - 2, p) + 1);
  77.         results[i] = p[newN - 1 + sortedByVal[i]];
  78.         update(newN - 1 + sortedByVal[i], p);
  79.     }
  80.  
  81.     vector<int> suba;
  82.     int i = n;
  83.     while (results[i] != p[0])
  84.         i--;
  85.     while (p[0] > 0) {
  86.         suba.push_back(i);
  87.         p[0]--;
  88.         while (i > 1 && results[suba.back()] != results[i - 1] + 1)
  89.             i--;
  90.         i--;
  91.     }
  92.     ofstream fout("output.txt");
  93.     fout << suba.size() << endl;
  94.     for (int i = suba.size() - 1; i >= 0; i--) {
  95.         fout << suba[i] << " ";
  96.     }
  97.     fout.close();
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement