树状数组,离散化。
每次往后加一个数字K,增加子序列个数为之前加的数字中找以小于等于K的值结尾的所有子序列之和+1(单独一个K)
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=100005;
const int mod=1000000007;
int a[MAXN], b[MAXN], c[MAXN], va[MAXN], m;
int find(int x)
{
int l=1, r=m-1, mid;
while(l<r)
{
mid=(l+r)>>1;
if(x==b[mid])
return mid;
if(x<b[mid])
r=mid-1;
else l=mid+1;
}
return l;
}
void init()
{
int i;
for(i=1;i<m;i++)
va[i]=0;
}
int lowbit(int x)
{
return x&(-x);
}
void add(int t,int up)
{
int i=t;
while(i<m)
{
va[i]=(va[i]+up)%mod;
i+=lowbit(i);
}
}
int ask(int t)
{
int i=t, ret=0;
while(i>0)
{
ret=(ret+va[i])%mod;
i-=lowbit(i);
}
return ret;
}
int main()
{
int n, i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
c[i]=a[i];
}
sort(c,c+n);
m=2;
b[1]=c[0];
for(i=1;i<n;i++)
if(c[i]!=c[i-1])
b[m++]=c[i];
int pos, now;
init();
int ans=0;
for(i=0;i<n;i++)
{
pos=find(a[i]);
now=ask(pos);
add(pos,now+1);
ans=(ans+now+1)%mod;
}
printf("%d\n",ans);
}
return 0;
}