悬赏关注O.o
查看原帖
悬赏关注O.o
771308
newcabbage楼主2023/6/5 22:14

不太明白为什么第一问len要减1才对 思路就是求最长不升子序列,再求最大上升子序列

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1e5 + 5;

int f[N], a[N], b[N];
int num;

int find1(int x, int len){
	int l = 1, r = len + 1;
	
	while(l < r){
		int mid = (l + r) >> 1;
		
		if(f[mid] <= x){
			r = mid;
		}else{
			l = mid + 1;
		}
	}

	while(f[l] == x){
		l++;
	}
	
	return l;
}


int find(int x, int len){
	int l = 1, r = len+1;
	
	while(l < r){
		int mid = (l + r) >> 1;
		
		if(f[mid] >= x){
			r = mid;
		}else{
			l = mid + 1;
		}
	}
	
	return l;
}

int main(){
	int len=0;
	
	while(~scanf("%d", &a[++num]))
	
	memset(f, -1, sizeof f);
	f[1] = 1e9;

	for(int i=1;i<=num;i++){
		int pos = find1(a[i], len);
		f[pos] = a[i];
		len = max(len, pos);
	}
	
	printf("%d\n", len-1);//不明白O.o
	len = 0;
	memset(f, 0x3f, sizeof f);
	f[1] = 0;
	
	for(int i=1;i<=num;i++){
		int pos = find(a[i], len);
		f[pos] = a[i];
		len = max(len, pos);
	}
	
	printf("%d", len);
	
	return 0;
}
2023/6/5 22:14
加载中...