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;
		}
	}
}

posted @ 2026-01-05 17:42  9102700  阅读(3)  评论(0)    收藏  举报