求助,最长上升子序列的长度一直不对,求求大佬帮帮我
查看原帖
求助,最长上升子序列的长度一直不对,求求大佬帮帮我
633031
fff1842889002楼主2022/7/17 16:02
#include<bits/stdc++.h>
#define INF 0x7fffffff  
using namespace std;
const int maxn=5*1e5+5 ;
int a[maxn],f[maxn],h[maxn];
int ans1,ans2;
int n;
int n1=1;
int bss(){
	f[1]  = a[1];
	int len = 1;
	for(int i=2;i<=n1;i++){
	int l=1,r=len,mid;
//		cout<<f[len]<<endl;
		if(a[i] <= f[len]) f[++len] = a[i];	
		else{
			while(r > l){
//		        printf("l=%d,r=%d,mid=%d\n",l,r,mid);
				mid = (l+r) >> 1 ;
//				printf("f[%d]=%d,a[%d]=%d\n",mid,f[mid],i,a[i]);
				if(f[mid] < a[i]) r = mid;
				
				else l=mid + 1;
//				printf("l=%d,r=%d,mid=%d\n",l,r,mid);
			}
			f[l] = max (a[i],f[l]) ;
		}
//		printf("i=%d len=%d\n",i,len);
	}
	return len;
}
int bxj(){
	h[1] = a[1];
	int len = 1;
	
	for(int i=2;i<=n1;i++){
		int l = 1,r = len,mid;
		if(a[i] >= h[len] ) h[++len] = a[i];
		else{
			while(r > l){
			mid = (l+r) >> 1;
			
			if(h[mid] > a[i]) r=mid;
			
			else l = mid+1;
		    } 
		    h[l] = min(a[i],h[l]);
		}
		//cout<<"h["<<l<<"]="<<h[l]<<" ";
		//cout<<"a["<<i<<"]="<<a[i]<<" len="<<len<<endl;
	}
	return len;
}
int main(){
//	一个序列最少的最长不上升子序列数量等于其最长上升子序列的长度
	while(cin>>n){
		a[n1] = n;
		h[n1] = INF;
		n1++;
	}
	n1-=1;
//	cout<<n1<<endl;
	ans1 = bss();
	ans2 = bxj();
//	for(int i=1;i<=8;i++){
//		printf("f[l]=%d",f[i]);
//	}
	cout<<ans1<<endl<<ans2<<endl;
	return 0;
}
2022/7/17 16:02
加载中...