hdu 5748 Bellovin(BestCoder Round #84——最长递增子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5748

Bellovin

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 929    Accepted Submission(s): 421

Problem Description

Peter has a sequence a1,a2,...,an and
he define a function on the sequence -- F(a1,a2,...,an)=(f1,f2,...,fn),
where fi is
the length of the longest increasing subsequence ending with ai.

Peter would like to find another sequence b1,b2,...,bn in
such a manner that F(a1,a2,...,an) equals
to F(b1,b2,...,bn).
Among all the possible sequences consisting of only positive integers, Peter wants the lexicographically smallest one.

The sequence a1,a2,...,an is
lexicographically smaller than sequence b1,b2,...,bn,
if there is such number i from 1 to n,
that ak=bk for 1≤k<i and ai<bi.

Input

There are multiple test cases. The first line of input contains an integer T,
indicating the number of test cases. For each test case:

The first contains an integer n (1≤n≤100000) --
the length of the sequence. The second line contains n integers a1,a2,...,an (1≤ai≤109).

Output

For each test case, output n integers b1,b2,...,bn (1≤bi≤109) denoting
the lexicographically smallest sequence.

Sample Input

3
1
10
5
5 4 3 2 1
3
1 3 5

Sample Output

1
1 1 1 1 1
1 2 3

Source

BestCoder Round #84

题目大意:

Peter有一个序列a_1,a_2,...,a_na?1??,a?2??,...,a?n??. 定义F(a_1,a_2,...,a_n)=(f_1,f_2,...,f_n)F(a?1??,a?2??,...,a?n??)=(f?1??,f?2??,...,f?n??), 其中f_if?i??是以a_ia?i??结尾的最长上升子序列的长度.

Peter想要找到另一个序列b_1,b_2,...,b_nb?1??,b?2??,...,b?n??使得F(a_1,a_2,...,a_n)F(a?1??,a?2??,...,a?n??)和F(b_1,b_2,...,b_n)F(b?1??,b?2??,...,b?n??)相同. 对于所有可行的正整数序列, Peter想要那个字典序最小的序列.

序列a_1, a_2, ..., a_na?1??,a?2??,...,a?n??比b_1, b_2, ..., b_nb?1??,b?2??,...,b?n??字典序小, 当且仅当存在一个正整数ii (1 \le i \le n)(1≤i≤n)满足对于所有的kk (1 \le k < i)(1≤k<i)都有a_k = b_ka?k??=b?k??并且a_i < b_ia?i??<b?i??.

解题思路:

定义一个l数组,初始化都为最大值。再循环输入的数。找到l数组中第一个比a大的数,记录下标即可。

详细过程如下图。

详见代码。

(第一种方法:通过二分的方法来找第一个比a大的数的下标值)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define INF (1<<31-1)

int l[100010];

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,a;
        scanf("%d",&n);
        for(int i=0; i<=n; i++)
            l[i]=INF;
        for (int i=0; i<n; i++)
        {
            scanf("%d",&a);
            int j;
            int ll,r;
            ll=0,r=n;
            while(ll<=r)
            {

                int mid=(r+ll)/2;
                if (a<l[mid])
                    r=mid-1;
                else if (a>l[mid])
                    ll=mid+1;
                else
                {
                    ll=mid;
                    break;
                }

            }
            printf (i==0?"%d":" %d",ll+1);
            l[ll]=a;
        }
        printf("\n");
    }
    return 0;
}

第二种方法(通过库的函数实现)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define INF (1<<31-1)

int l[100010];

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,a;
        scanf("%d",&n);
        for(int i=0; i<=n; i++)
            l[i]=INF;
        for (int i=0; i<n; i++)
        {
            scanf("%d",&a);
            int ll=lower_bound(l,l+n,a)-l;//得到l数组里第一个比a大的数
            printf (i==0?"%d":" %d",ll+1);
            l[ll]=a;
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-08-12 10:51:31

hdu 5748 Bellovin(BestCoder Round #84——最长递增子序列)的相关文章

HDU 5748 BestCoder Round #84 Bellovin (LIS)

Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 540    Accepted Submission(s): 254 Problem Description Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F

HDU 5749 BestCoder Round #84 Colmerauer(暴力贡献)

Colmerauer Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 94 Problem Description Peter has an n×m matrix M. Let S(a,b) be the sum of the weight all a×b submat

HDU 1159:Common Subsequence(最长公共子序列)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23108    Accepted Submission(s): 10149 Problem Description A subsequence of a given sequence is the given sequence with some e

HDU 3998 Sequence (最长递增子序列+最大流SAP,拆点法)经典

Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1666    Accepted Submission(s): 614 Problem Description There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequ

算法面试题 之 最长递增子序列 LIS

找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E6%95%B0%E7%BB%84%E9%83%BD%E6%B2%A1%E7%BB%99%E5%87%BA%E6%9D%A5 我就是理解了一下他的分析 用更通俗易懂的话来说说题目是这样 d[1..9] = 2 1 5 3 6 4 8 9 7 要求找到最长的递增子序列首先用一个数组b[] 依次的将d里面

【网络流24题】最长递增子序列

Description 给定正整数序列x1,..., xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列. 设计有效算法完成(1)(2)(3)提出的计算任务 Input 第1 行有1个正整数n(n<=500),表示给定序列的长度. 接下来的1 行有n个正整数x1,..., xn. Output 第1 行是最长递增子序列的长度s. 第2行是可

最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列. 考虑最长公共子序列问题如何分解成

最长递增子序列问题 2011-12-29

算法实现题8-6 最长递增子序列问题(习题 8-17) ´问题描述: 给定正整数序列 n x x , ,1 ? . (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和 xn,则从给定序列中最多可取出多少个长度为s的递增子序列. ´编程任务: 设计有效算法完成(1)(2)(3)提出的计算任务. ´数据输入: 由文件input.txt提供输入数据.文件第1 行有 1个正整数n,表示给定序列的长度.接下来的1

【网络流24题】 最长递增子序列问题

(题目复制自洛谷) 题目描述 给定正整数序列x1,...,xn . (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列. 编程任务: 设计有效算法完成(1)(2)(3)提出的计算任务. 输入输出格式 输入格式: 第1 行有1个正整数n,表示给定序列的长度.接下来的1 行有n个正整数n:x1, ..., xn. 输出格式: 第1 行是最长递增子序列的