multiset处理最长上升、下降、非下降、非上升子序列
最长上升子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1257
从这道题中还可以看出:最长上升子序列的长度 = 单调不增(不严格下降)子序列的最少个数
multiset< int >s;
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
int x;cin>>x;
auto it = s.lower_bound(x);
if(it != s.end())
s.erase(it);
s.insert(x);
}
printf("%d\n",s.size());
s.clear();
}
return 0;
}
最长非下降子序列
https://www.oj.swust.edu.cn:50443/problem/show/2870
int main()
{
int n;
scanf("%d",&n);
multiset<int>s;
s.clear();
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
auto it = s.upper_bound(x);
if(it==s.end())
s.insert(x);
else {
s.erase(it);
s.insert(x);
}
}
printf("%d\n",s.size());
return 0;
}
最长下降子序列
https://www.oj.swust.edu.cn:50443/problem/show/2846
从这道题中还可以看出:最长下降子序列的长度 = 单调不降(不严格递增)子序列的最少个数
multiset< int >s;
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
int x;cin>>x;
auto it = s.lower_bound(-x);
if(it != s.end())
s.erase(it);
s.insert(-x);
}
printf("%d\n",s.size());
s.clear();
}
return 0;
}
最长非上升子序列
multiset< int >s;
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
int x;cin>>x;
auto it = s.upper_bound(-x);
if(it != s.end())
s.erase(it);
s.insert(-x);
}
printf("%d\n",s.size());
s.clear();
}
return 0;
}