Bellovin
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 989 Accepted Submission(s): 442
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).
這題目貼的我好崩潰= =,直接點連接看題吧……點我點我
這個就是一個很裸的求最長上升子序列,這裏我貼上O(nlogn)的做法。具體分析這裏不貼了。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define N 100000+10
#define INF 0x3f3f3f3f
int a[N],g[N],dp[N];
int main()
{
int T;
int i,n;
scanf("%d",&T);
while(T--)
{
memset(g,INF,sizeof(g));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]),dp[i]=1;
for(i=0;i<n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i])-g;//大於a[i]的最小值的位置
g[k]=min(g[k],a[i]);
dp[i]=max(k,dp[i]);//在dp[i]處能達到的最長的位置
}
for(i=0;i<n-1;i++)
printf("%d ",dp[i]);
printf("%d\n",dp[i]);
}
return 0;
}