Untitled
unknown
c_cpp
5 months ago
1.7 kB
7
Indexable
#include <iostream> #include<vector> #include<math.h> using namespace std; int lis(vector<int>a) { vector<vector<int>> arr = { {a[0]} }; for (int i = 1; i < a.size(); ++i) { int s = 0, e = arr.size() - 1, res = arr.size(); while (s <= e) { int mid = (s + e) / 2; if (arr[mid].back() < a[i]) s = mid + 1; else e = mid - 1, res = mid; } if (res == arr.size()) arr.push_back({ a[i] }); else arr[res].push_back(a[i]); } return (int)arr.size(); } int main() { int n, lm; cin >> n >> lm; vector<int> a(n); for (auto& x : a) cin >> x; if (lm == 0) cout << lis(a); else if (lm == pow(10, 9)) { vector<vector<int>> arr = {}; vector<int> idx(n); int ans = 1; for (int i = 0; i < a.size(); ++i) { int s = 0, e = arr.size() - 1, res = arr.size(); while (s <= e) { int mid = (s + e) / 2; if (arr[mid].back() < a[i]) s = mid + 1; else e = mid - 1, res = mid; } idx[i] = res; if (res == arr.size()) arr.push_back({ a[i] }); else arr[res].push_back(a[i]); } vector<vector<int>> arr2 = {}; for (int i = a.size() - 1; i >= 0; --i) { ans = max(ans, (int)arr.size() + (int)arr2.size()); arr[idx[i]].pop_back(); if (arr[idx[i]].size() == 0) arr.pop_back(); int s = 0, e = arr2.size() - 1, res = arr2.size(); while (s <= e) { int mid = (s + e) / 2; if (arr2[mid].back() > a[i]) s = mid + 1; else e = mid - 1, res = mid; } if (res == arr2.size()) arr2.push_back({ a[i] }); else arr2[res].push_back(a[i]); } cout << ans; } else { int ans = 1; for (int l = 0; l < n; ++l) a[l] -= lm, ans = max(ans, lis(a)); cout << ans; } }
Editor is loading...
Leave a Comment