2407. 最长递增子序列 II - 力扣(LeetCode)
线段树练习
class Solution {
public:
vector<int> tree;
int get(int node, int l, int r, int L, int R) {
if (L <= l && r <= R) return tree[node];
int mid = (l + r) >> 1;
int ret = 0;
if (L <= mid) ret = get(node * 2, l, mid, L, R);
if (R > mid) return max(ret, get(node * 2 + 1, mid + 1, r, L, R));
return ret;
}
void update(int node, int l, int r, int pos, int val) {
tree[node] = max(tree[node], val);
if (l == r) return;
int mid = (l + r) >> 1;
if (pos <= mid) update(node * 2, l, mid, pos, val);
else update(node * 2 + 1, mid + 1, r, pos, val);
return;
}
int lengthOfLIS(vector<int>& nums, int k) {
int u = *max_element(nums.begin(), nums.end());
tree.resize(4 * u);
for (int i = 0; i < nums.size(); i++) {
int f = 1;
if (nums[i] != 1){
int x = nums[i] - k > 0 ? nums[i] - k : 1;
f = get(1, 1, u, x, nums[i] - 1) + 1;
}
update(1, 1, u, nums[i], f);
}
return tree[1];
}
};