二分求最大上升子序列,并且找到这个子序列
/*
用二分求最大上升子序列,并且找到这个子序列。
先找一下它所在“候选者序列”中的位置。
1.如果直接在最后,就直接接到最后
2.如果不在最后,就替换(候选者序列中)大于等于它的第一个数(cur)。这是为了让后面的数更好接到它后面
如果要是求序列本身,
就在1中,直接往后接;
2中,让(候选者序列中)cur-1作为它的前一个数
注意,不能只修改最后一个数却不二分。
那样的话会发现可能导致倒数第二个数特别大,后面的数改不了了
*/
r(i,1,n){
int cur=lower_bound(b+1,b+1+tot,a[i])-b;
pre[a[i]]=b[cur-1];
b[cur]=a[i];
if(cur>mx){
mx=cur;
last=a[i];
}
}