LIS
这是二分优化的 LIS(严格上升)子序列
#define int long long
int len[N];
int mylower(int x, int l, int r){
while(l < r){
int mid = (l + r + 1) >> 1;
if(x > len[mid]){
l = mid;
}else{
r = mid - 1;
}
}
return l;
}
int LIS(vector<int> v){
len[0] = -inf;
for(int i = 1; i < N; i++){
len[i] = inf;
}
int vs = v.size();
for(int i = 0; i < vs; i++){
int pos = mylower(v[i], 0, i);
len[pos + 1] = min(len[pos + 1], v[i]);
}
for(int i = 1; i <= vs + 1; i++){
if(len[i] == inf){
return i - 1;
}
}
}

浙公网安备 33010602011771号