Bellovin -HDU5487

来源:互联网 发布:mac开发网站 编辑:程序博客网 时间:2024/06/04 17:41


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

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

The sequence a1,a2,...,ana1,a2,...,an is lexicographically smaller than sequence b1,b2,...,bnb1,b2,...,bn, if there is such number ii from 11 to nn, that ak=bkak=bk for 1k<i1≤k<i and ai<biai<bi.
Input
There are multiple test cases. The first line of input contains an integer TT, indicating the number of test cases. For each test case: 

The first contains an integer nn (1n100000)(1≤n≤100000) -- the length of the sequence. The second line contains nn integers a1,a2,...,ana1,a2,...,an (1ai109)(1≤ai≤109).
Output
For each test case, output nn integers b1,b2,...,bnb1,b2,...,bn (1bi109)(1≤bi≤109) denoting the lexicographically smallest sequence. 
Sample Input
311055 4 3 2 131 3 5
Sample Output
11 1 1 1 11 2 3
这道题题意就是给出一个序列,求出以每个元素结尾的最长子序列的长度,然后按序输出就行

#include <cstdio>  #include <algorithm>  #define INF 0x3f3f3f3f #define maxx 100000+10using namespace std;int dp[maxx],a[maxx],t[maxx]; int main()  {      int n,i,j;      int T;scanf("%d",&T);    while(T--)      {  scanf("%d",&n);        for(i=0;i<n;i++)          {              scanf("%d",&a[i]);              dp[i]=INF;          }          for(i=0;i<n;i++) {              *lower_bound(dp,dp+n,a[i])=a[i];             t[i]=lower_bound(dp,dp+n,a[i])-dp+1;//减去后腰加上1才是个数        }        for(int i = 0; i < n-1; i++)printf("%d ",t[i]);printf("%d\n",t[n-1]);           }      return 0;  }