关于取等的问题
查看原帖
关于取等的问题
365777
halehu楼主2022/8/18 16:57

有如下两份代码:

#include<iostream>
#include<algorithm>
using namespace std;
//求一个序列能剖分成的最小不上升子序列数量,
//即为求一个序列最大上升子序列长度(Dilworth定理) 
//压行机走起
typedef long long LL;
LL n,cnt,len,i,j,f[200005],a,g[200005]; 
int main(){
	while(cin>>a){
		LL pos1=lower_bound(f,f+len,a,greater<LL>())-f;
		//lower+greater寻找第一个小于等于a的地址(要减去数组地址) 
		LL pos2=upper_bound(g,g+cnt,a)-g;//upper寻找第一个大于a的地址
		if(pos1==len)f[len++]=a;
		else f[pos1]=a;
		if(pos2==cnt)g[cnt++]=a;
		else g[pos2]=a; 
	}
	cout<<len<<endl<<cnt<<endl;
	return 0;
}

全wa,8分

#include<iostream>
#include<algorithm>
using namespace std;
//求一个序列能剖分成的最小不上升子序列数量,
//即为求一个序列最大上升子序列长度(Dilworth定理) 
//压行机走起
typedef long long LL;
LL n,cnt,len,i,j,f[200005],a,g[200005]; 
int main(){
	while(cin>>a){
		LL pos1=upper_bound(f,f+len,a,greater<LL>())-f;
		//upper+greater寻找第一个小于a的地址(要减去数组地址) 
		LL pos2=lower_bound(g,g+cnt,a)-g;//lower寻找第一个大于等于a的地址
		if(pos1==len)f[len++]=a;
		else f[pos1]=a;
		if(pos2==cnt)g[cnt++]=a;
		else g[pos2]=a; 
	}
	cout<<len<<endl<<cnt<<endl;
	return 0;
}

ac

难道不应该是第一份代码更正确吗?第一问求的是最长不下降啊,要取等,应该用lower_bound啊,为什么upper对了呢?

2022/8/18 16:57
加载中...