有如下两份代码:
#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对了呢?