hdu 5748 Bellovin【最长上升子序列】

题目链接:https://vjudge.net/contest/148584#problem/A

题目大意:

解题思路:
题目要求为:输出与已知序列的每一个元素的f(i)(f(i)的定义如题)相同的字典序最小的序列。稍微思考便知,其实就是叫我们求出原序列的f(i),这个很容易做到,只要在最长上升子序列的模板题上稍微做一些改动,记录下原序列每一个元素的f(i)即可。具体实现见代码。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int rise[N],ans[N];
int n;

int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        int len=0;rise[0]=-1;
        for(int i=1;i<=n;i++){
            int data;scanf("%d",&data);
            if(data>rise[len])rise[++len]=data,ans[i]=len;     //记录以i为末尾的最长上升子序列的长度
            else {
                int loc=lower_bound(rise+1,rise+1+len,data)-rise;     //最长上升子序列用lower_bound
                rise[loc]=data;
                ans[i]=loc;     //记录以i为末尾的最长上升子序列的长度
            }
        }
        for(int i=1;i<=n;i++)
            i==n?printf("%d
",ans[i]):printf("%d ",ans[i]);
    }
}
原文地址:https://www.cnblogs.com/00isok/p/8971266.html