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

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

题目大意:

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

#include <cstdio>
#include <algorithm>  
using namespace std;

int b[100005], c[100005];
int n;

int main()
{
    int t, data;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        int num = 0;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &data);
            if (i == 1) b[++num] = data, c[1] = 1;            //b[]数组的个数是以i为末尾的最长子序列长度,b[]数组内元素为此时组成最长上升子序列的元素
            else if (data>b[num]) b[++num] = data, c[i] = num;
            else
            {
                int k = lower_bound(b + 1, b + 1 + num, data) - b;           //二分查找函数,查找大于data的第一个元素的位置
                b[k] = data;
                c[i] = k;                //c[i]记录的是以i为末尾的最长子序列长度
            }
        }
        for (int i = 1; i<n; i++)
            printf("%d ", c[i]);
        printf("%d\n", c[n]);
    }
    return 0;
}

2018-04-29

猜你喜欢

转载自www.cnblogs.com/00isok/p/8971266.html