The next "Data Structures and Algorithms" lesson will be about Longest Increasing Subsequence (LIS for short) of a sequence. For better understanding, Nam decided to learn it a few days before the lesson.
Nam created a sequence a consisting of n (1 ≤ n ≤ 105) elements a1, a2, ..., an (1 ≤ ai ≤ 105). A subsequence ai1, ai2, ..., aik where1 ≤ i1 < i2 < ... < ik ≤ n is called increasing if ai1 < ai2 < ai3 < ... < aik. An increasing subsequence is called longest if it has maximum length among all increasing subsequences.
Nam realizes that a sequence may have several longest increasing subsequences. Hence, he divides all indexes i (1 ≤ i ≤ n), into three groups:
- group of all i such that ai belongs to no longest increasing subsequences.
- group of all i such that ai belongs to at least one but not every longest increasing subsequence.
- group of all i such that ai belongs to every longest increasing subsequence.
Since the number of longest increasing subsequences of a may be very large, categorizing process is very difficult. Your task is to help him finish this job.
The first line contains the single integer n (1 ≤ n ≤ 105) denoting the number of elements of sequence a.
The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 105).
Print a string consisting of n characters. i-th character should be '1', '2' or '3' depending on which group among listed above index ibelongs to.
1
4
3
In the second sample, sequence a consists of 4 elements: {a1, a2, a3, a4} = {1, 3, 2, 5}. Sequence a has exactly 2 longest increasing subsequences of length 3, they are {a1, a2, a4} = {1, 3, 5} and {a1, a3, a4} = {1, 2, 5}.
In the third sample, sequence a consists of 4 elements: {a1, a2, a3, a4} = {1, 5, 2, 3}. Sequence a have exactly 1 longest increasing subsequence of length 3, that is {a1, a3, a4} = {1, 2, 3}.
题意:对于一个n序列中的LIS进行一个分类
题解:我们用nlogn二分的方法求LIS,l[i]表示正向包含a[i]的LIS,r[i]表示反向不包含a[i]的LIS
如果l[i]+r[i]==LIS 则为可以判断其必处于某一LIS之中,否则必然不在任意一个LIS之中,可判该点为1
在对于多个相同l[i] 可以判断为2
其余为3
///1085422276 #include<bits/stdc++.h> using namespace std ; typedef long long ll; #define mem(a) memset(a,0,sizeof(a)) #define pb push_back #define meminf(a) memset(a,127,sizeof(a)); inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0';ch=getchar(); }return x*f; } //**************************************** #define maxn 100000+50 #define mod 1000000007 #define inf 1000000007 int a[maxn],b[maxn],dp[maxn],l[maxn],r[maxn],ans[maxn],D[maxn]; int main(){ int n=read(); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[n-i+1]=-a[i]; } fill(dp+1,dp+n+1,inf); for(int i=1;i<=n;i++){ int tmp=lower_bound(dp+1,dp+n+1,a[i])-dp; l[i]=tmp; dp[tmp]=a[i]; } int L=lower_bound(dp+1,dp+n+1,inf)-dp; L--; fill(dp+1,dp+n+1,inf); for(int i=1;i<=n;i++){ int tmp=lower_bound(dp+1,dp+n+1,b[i])-dp; r[n-i+1]=tmp-1; dp[tmp]=b[i]; }mem(D);mem(ans); for(int i=1;i<=n;i++){ if(r[i]+l[i]==L){ D[l[i]]++; } else { ans[i]=1; } } for(int i=1;i<=n;i++){ if(ans[i]==1)cout<<1; else if(D[l[i]]>1)cout<<2; else cout<<3; } cout<<endl; return 0; }