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
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)
3 1 10 5 5 4 3 2 1 3 1 3 5
1 1 1 1 1 1 1 2 3
题解:
lis的经典题目就是求一个数更新后其前有多少个递增数,。。。水水水。。。。代码如下:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int a[100010]; int dp[100010]; int b[100010]; int main() { int n; scanf("%d",&n); while(n--){ int m; scanf("%d",&m); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++){ scanf("%d",&a[i]); } fill(dp+1,dp+m+1,INF); dp[1]=a[1]; b[0]=1; int k=1; for(int i=2;i<=m;i++){ int pos=lower_bound(dp,dp+m,a[i])-dp; dp[pos]=a[i]; b[k++]=pos; } for(int i=0;i<k;i++){ printf("%d%c",b[i],i==k-1?'\n':' '); } } return 0; }