数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多少个。由于数量很大,输出Mod 1000000007的结果即可。相同的数字在不同的位置,算作不同的,例如 {1 1 2} 答案为2。
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000) 第2 - N + 1行:每行1个数A[i],表示数组的元素(0 <= A[i] <= 10^9)
Output
输出最长递增子序列的数量Mod 1000000007。
Input示例
5 1 3 2 0 4
Output示例
2 解题: 直接维护到每一个位置为止的递增长度即可,重载一下加法操作。#include<iostream> #include<cstdio> #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> using namespace std; #define mod 1000000007 const int maxn =60000; int n; int lowbit(int x) { return x&(-x); } struct node { int len; int kind; node(){len=0; kind=0;} node(int _len,int _kind){len=_len;kind=_kind;} node operator +(const node &tmp)const { if(len<tmp.len) return tmp; if(len==tmp.len) return node(len,(kind+tmp.kind)%mod);//勿忘取mod return (*this); } }b[2*maxn]; struct P { int pos,val; bool operator <(const P &tmp)const { if(val==tmp.val)//注意这里位置排序 { return pos>tmp.pos; } return val<tmp.val; } }a[maxn]; node getsum(int x) { node tmp; while(x>0) { tmp=tmp+b[x]; x-=lowbit(x); } return tmp; } void update(int x,node tp) { while(x<=n) { b[x]=b[x]+tp; x+=lowbit(x); } } int main() { // freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&a[i].val); a[i].pos=i; } sort(a+1,a+n+1); node tmp,miao; for(int i=1;i<=n;i++) { tmp=getsum(a[i].pos); if(tmp.len==0) tmp.kind=1; tmp.len++; update(a[i].pos,tmp); miao=miao+tmp; } // node miao; // for(int i=1;i<=n;i++) // miao=miao+b[i]; printf("%d\n",miao.kind); } return 0; }