Untitled

 avatar
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