hdoj 5748 Bellovin (LIS) 【BestCoder Round #84 】

来源:互联网 发布:网络信息自查报告 编辑:程序博客网 时间:2024/04/30 09:10

Bellovin

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

Total Submission(s): 1103    Accepted Submission(s): 498


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 1k<i and ai<bi.
 

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

The first contains an integer n(1n100000) -- the length of the sequence. The second line contains n integers a1,a2,...,an(1ai109).
 

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

Sample Input
311055 4 3 2 131 3 5
 

Sample Output
11 1 1 1 11 2 3
 

Source
BestCoder Round #84
 题目大意:开始没怎么理解题意,看了题解,是问以 a[i]结尾的最长递增子序列的长度
思路:还是LIS最长递增子序列,二分法插入的位置就是以当前结尾的最长递增子序列。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#define M 100000+10using namespace std;int f[M],a[M],b[M];int len;void get_len(int n){int i;b[1]=a[1];f[1]=1;len =1;for(i=2;i<=n;i++){if(a[i]>b[len]){b[++len]=a[i];f[i]=len;}else{int pos=lower_bound(b+1,b+len+1,a[i])-b;//二分可以插入的位置,该位置也是以a[i]结尾的最长子序列 b[pos]=a[i];f[i]=pos;//这里是pos,不是len了 }}}int main(){int t,n,i;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);}get_len(n);for(i=1;i<n;i++)printf("%d ",f[i]);printf("%d\n",f[n]);}return 0;}

对LIS又有了更深的认识

0 0
原创粉丝点击