mitkonikov

Nova Video Igra

Feb 23rd, 2023
692
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define endl '\n'
  4.  
  5. using namespace std;
  6.  
  7. struct FenwickTree {
  8.     vector<int> fwt;
  9.  
  10.     FenwickTree(int n) {
  11.         fwt.resize(n, 0);
  12.     }
  13.  
  14.     void maxFWT(int ind, int val = 1) {
  15.         for (ind++; ind < fwt.size(); ind+=ind&-ind)
  16.             fwt[ind] = max(fwt[ind], val);
  17.     }
  18.  
  19.     int getFWT(int ind) {
  20.         int s = 0;
  21.         for (ind++; ind > 0; ind-=ind&-ind)
  22.             s = max(s, fwt[ind]);
  23.         return s;
  24.     }
  25.  
  26.     void reset() {
  27.         fill(fwt.begin(), fwt.end(), 0);
  28.     }
  29. };
  30.  
  31. int main() {
  32.     const int MXN = 510;
  33.     int n, mxK;
  34.     cin >> n >> mxK;
  35.      
  36.     vector<int> v(n);
  37.     for (int i = 0; i < n; i++) scanf("%d", &v[i]);
  38.      
  39.     auto update = [](FenwickTree &fwt, int element) {
  40.         int mx = fwt.getFWT(element);
  41.         fwt.maxFWT(element, mx + 1);
  42.         return mx + 1;
  43.     };
  44.  
  45.     // precomp
  46.     FenwickTree fwt_init(MXN);
  47.     vector<FenwickTree> dp_up(n, FenwickTree(MXN));
  48.     for (int i = 0; i < n; i++) {
  49.         update(fwt_init, v[i]);
  50.         copy(fwt_init.fwt.begin(), fwt_init.fwt.end(), dp_up[i].fwt.begin());
  51.     }
  52.  
  53.     fwt_init.reset();
  54.     vector<FenwickTree> dp_down(n, FenwickTree(MXN));
  55.     for (int i = n-1; i >= 0; i--) {
  56.         update(fwt_init, mxK - v[i]);
  57.         copy(fwt_init.fwt.begin(), fwt_init.fwt.end(), dp_down[i].fwt.begin());
  58.     }
  59.      
  60.     int ans = 1;
  61.     for (int i = n - 1; i >= 0; i--) {
  62.         vector<int> tail;
  63.         for (int j = i; j >= 0; j--) {
  64.             if (v[j] < v[i]) continue;
  65.             auto b = tail.begin(), e = tail.end();
  66.             auto it = lower_bound(b, e, v[j]);
  67.      
  68.             if (it == tail.end()) tail.push_back(v[j]);
  69.             else {
  70.                 while (it != tail.end() && *it == v[j]) {
  71.                     it++;
  72.                 }
  73.  
  74.                 if (it == tail.end()) tail.push_back(v[j]);
  75.                 else *it = v[j];
  76.             }
  77.  
  78.             int left = (j - 1 >= 0) ? dp_up[j - 1].getFWT(v[i]) : 0;
  79.  
  80.             for (int l = 0; l < tail.size(); l++) {            
  81.                 int right = (i + 1 < n) ? dp_down[i + 1].getFWT(mxK - tail[l]) : 0;
  82.                 // cout << i << " " << j << " : " << left << " " << count << " " << right << endl;
  83.                 ans = max(ans, left + l + 1 + right);
  84.             }
  85.         }
  86.     }
  87.  
  88.     cout << ans << endl;
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment