lower_bound与upper_bound:
lower_bound(va.begin(),va.end(),a[i]);//返回第一个大于等于a[i]的地址
upper_bound(va.begin(),va.end(),a[i]);//返回第一个大于a[i]的地址
最长上升子序列与最长非递减子序列:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 100;
const double eps = 1e-6;
ll gcd(ll a,ll b){return b==0? a:gcd(b,a%b);}
int main(){
int n;
cin>>n;
string str;
cin>>str;
vector<char>vc;
vc.push_back(str[0]);
int len=str.size();
for(int i=1;i<len;i++){
if(str[i]>=vc.back()){
vc.push_back(str[i]);
}else{
vector<char>::iterator it=upper_bound(vc.begin(),vc.end(),str[i]);//区别看这里使用哪个
*it=str[i];
}
}
int ans=vc.size();
cout<<len-ans;
return 0;
}
O(nlogn)的lis(不包括重复的,前面的严格小于后面的)使用lower_bound,使va中的值尽量小,这样序列才会更长。