HDU - 5748 Bellovin —— 最长上升子序列
2018-02-05 21:00
281 查看
Bellovin
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2063 Accepted Submission(s): 808
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
题意:给定一个数组,下标1~n,问到每个i位置的最长上升子序列的长度
思路:和找整个数组的最长子序列相似,只不过在寻找过程中不断记录下到每个位置的最长上升子序列的长度
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <algorithm>
#define ll long long
#define max_ 100100
#define les 1e-6
#define inf 0x3f3f3f3f
using namespace std;
int n;
int num[max_],dp[max_],ans[max_];
int main(int argc, char const *argv[]) {
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
dp[i]=inf;
}
for(int i=1;i<=n;i++)
{
int k=lower_bound(dp+1,dp+1+n,num[i])-dp;
ans[i]=k;
dp[k]=num[i];
}
printf("%d",ans[1]);
for(int i=2;i<=n;i++)
printf(" %d",ans[i]);
printf("\n" );
}
return 0;
}
相关文章推荐
- BestCoder Round #84 1002 hdu 5748 最长上升子序列
- hdu 5748 最长上升子序列
- HDU 5748 Bellovin(最长上升子序列[nlogn])
- hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)
- hdu 5748 && poj 2533 最长上升子序列(o(nlogn)做法)
- 每日三题-Day3-C(HDU 1257 最少拦截系统 最长上升子序列O(nlogn) )
- HDU 1069 Monkey and Banana 最长上升子序列模板
- HDU 1087 最长上升子序列
- hdu 5532(最长上升子序列)
- hdu 5811 Colosseo (拓扑排序 + 最长上升子序列)
- hdu 1423 最长公共上升子序列
- HDU 5773 The All-purpose Zero(最长上升子序列)
- hdu 1423 最长公共上升子序列
- HDU-1257--最少拦截系统--最长上升子序列
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1069 Monkey and Banana(dp 最长上升子序列)
- hdu 1950 Bridging signals--二分法求最长上升子序列
- hdu 1069 Monkey and Banana 最长上升子序列。
- HDU 6197 array array array(最长上升或下降子序列)
- hdu 1025 最长上升子序列+排序