不上升(即不严格下降):
v.push_back(a[1]);
for(int i=2;i<=n;i++)
{
if(v.back()>=a[i])
v.push_back(a[i]);
else
{
*upper_bound(v.begin(),v.end(),a[i],greater())=a[i];
}
}
cout<<v.size()<<endl;
严格上升
vector<int> v;
v.push_back(a[1]);
for(int i=2;i<=n;i++)
{
if(v.back()<a[i]) v.push_back(a[i]);
else
{
*lower_bound(v.begin(), v.end(),a[i])=a[i];
}
}
int sec=v.size();
注意到除了greater这个上升和下降的区别之外,还有一个区别:
严格与不严格区别在于lower和upper
因为lower,是找可以相等的第一个,upper是严格大于(或小于)的第一个
无论严格还是不严格,在替换vector中元素的时候我们总“想”替换更往后的(在保证单调性的前提下),因爱理来说单调栈中的元素约往后应该越束缚我们的选择,那么后面的被替换了说明束缚一定更小了。
而upper比lower_bound更容易替换到后面的,如果满足正确性,Upper自然更想用upper(为了求更好的最值)
由于求严格单调子序列时,我们不允许相等,如果前面有等于的,你肯定要替换等于的;如果你跳过等于的替换第一个严格大于或小于的,那么这位就变成等于的了,与前面撞了,不满足严格单调。
如果考虑的是不严格单调,允许相等,那么我们当然不愿意替换相等的,因为换了和没换一样,如果有相等的,要替换相等之后的下一个。