hdu-5748 Bellovin(最长上升子序列)

题目链接:

Bellovin

Time Limit: 6000/3000 MS (Java/Others)   

 Memory Limit: 131072/131072 K (Java/Others)

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

题意:

给一个序列,求出每个位置结尾的最长上升子序列;然后找一个字典序最小的这个函数值相同的子序列;

思路:

求完这个函数值后这个函数值就是这个字典序最小的序列了;

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
//#include <bits/stdc++.h>
#include <stack>

using namespace std;

#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));

typedef  long long LL;

template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<‘0‘||CH>‘9‘;F= CH==‘-‘,CH=getchar());
    for(num=0;CH>=‘0‘&&CH<=‘9‘;num=num*10+CH-‘0‘,CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + ‘0‘);
    putchar(‘\n‘);
}

const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=1e9;
const int N=1e5+10;
const int maxn=500+10;
const double eps=1e-8;

int a[N],d[N],g[N];

int main()
{       

        int t;
        read(t);
        while(t--)
        {
            int n;
            read(n);
            For(i,1,n)read(a[i]);
            for(int i=1;i<=n;i++)g[i]=inf;
            for(int i=1;i<=n;i++)
            {
                int k=lower_bound(g+1,g+n+1,a[i])-g;
                d[i]=k;
                g[k]=a[i];
            }
            for(int i=1;i<n;i++)printf("%d ",d[i]);printf("%d\n",d[n]);
        }
        return 0;
}

  

时间: 2024-10-07 00:20:55

hdu-5748 Bellovin(最长上升子序列)的相关文章

hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)

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

hdu 1025 dp 最长上升子序列

1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len

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,

hdu 1160 排序 + 最长上升子序列

题意: 输出体重上升而速度下降的最长子序列 题意: 先按照结构体升序排序体重,之后用dp对速度求最长下降子序列即可. 代码: #include <set> #include <map> #include <cmath> #include <stack> #include <queue> #include <string> #include <vector> #include <cstdio> #include

!HDU 1513 Palindrome--dp--(最长公共子序列模型)

题意:给定一个字符序列,求最少添加多少个字符能让它变成对称序列 分析:这题的做法竟然是把序列颠倒之后求最长公共子序列,然后n-dp[n][n]就是答案.记住这种做法. 在这里再说一次最长公共子序列的做法:dp[i][j]表示序列1的前i个字符和序列2的前j个字符比较时的最长公共子序列的长度,状态转移公式:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]+1:2.否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 代码: #include<iost

Bridging signals hdu 1950 (最长上升子序列)

http://acm.split.hdu.edu.cn/showproblem.php?pid=1950 题意:求最长上升(不连续or连续)子序列 推荐博客链接: http://blog.csdn.net/sinat_30062549/article/details/47197073 #include <iostream> #include <stdio.h> #include <string.h> #include <string> #include &l

HDU - 1677Nested Dolls最长上升子序列变式

HDU - 1677 Nested Dolls Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description Dilworth is the world's most prominent collector of Russian nested dolls: he literally has thousands of them! You know, the

HDU 1069 dp最长递增子序列

B - Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1069 Appoint description: Description A group of researchers are designing an experiment to test the IQ of a monkey. They wi

HDU 1159 LCS最长公共子序列

1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 const int N = 1005; 6 #define max(a,b) a>b?a:b 7 8 char a[N] , b[N]; 9 int dp[N][N]; 10 11 int main() 12 { 13 while(scanf("%s%s" , a+1 , b+1) != EOF){ 14 int l1 =